2011-08-10 9 views
0

バインドされた値に入力番号を追加して、合計関数のリストを返す関数を書く必要があります。これは私がやったことです:2,3,4,5,6が、それは問題では "I" である6,6,6,6,6ジェネレータと実際の変数の値

です:

def addition_range(start, end): 
    if start >= end: return None 

    #res = ((lambda x: x + i) for i in range(start, end)) #1 
    res = [ (lambda x: x + i) for i in range(start, end) ] #2 

    return res 

for i in addition_range(0, 5): print(i(2)) 

出力は次のようにする必要があります私が関数を呼び出すとき、リストの生成中に使用される値ではなく、実際の値i(4)を使用します。問題は(#1)の代わりに(#2)を使って簡単に解決できますが、(#2)の解決策はありますか?試しました

res = [ (lambda x: x + copy.deepcopy(i)) for i in range(start, end) ] 

しかし、それは役に立ちません。

ありがとうございます。

のWinXP + Pythonの3.2

答えて

1

これを解決する最も簡単な方法は、ダミーのパラメータを追加することです:

def addition_range(start, end): 
    res = [(lambda x, i=i: x + i) for i in range(start, end)] 
    return res or None 

バージョンがiを評価し、一方、ダミーパラメータは、ラムダが定義されている時に評価されますラムダが呼び出されたときだけです。

サイドノート:or None部分を追加して、実装の動作を正確にシミュレートしました。 Noneの代わりに空のリストを返すほうがよいでしょう:

def addition_range(start, end): 
    return [(lambda x, i=i: x + i) for i in range(start, end)] 
+0

ありがとう、それは動作します! – fogbit

関連する問題