0

2 つの例があります。

# 1st example
>>> def accum(sum, a):
        return sum + a
>>> sum = 0
>>> for sum in iter(lambda:accum(sum, 2), 40):
        print sum,

2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32...

# 2nd example
>>> def accum(sum, a):
        return sum + a
>>> sum = 0
>>> for sum in iter(accum(sum, 2), 40):
        print sum,
TypeError: iter(v, w) : v must be callable

ラムダ関数はエラーにならないのにaccum関数はエラーになるのはなぜですか?

前もって感謝します :)

4

2 に答える 2

2

どちらの場合も、引数を取る関数を渡しています。2 番目のケースでは、の値はv整数2にバインドされますが、最初のケースでvは、呼び出し可能な無名ラムダ関数を参照します() -> sum + a

次の 2 つはほぼ同等です。

def x():
    return sum + a

x = lambda: sum + a

ラムダ関数には名前が付けられていないため、except lambda は適切なデバッグ トレースバックを提供しません。

また、変数の名前は少し誤解を招きやすいので、何が起こっているのかを理解するのに少し時間がかかりました。呼び出される変数は正確に 2つありますsum。1 つは関数内、もう 1 つaccumはグローバル スコープです。グローバル組み込み関数を含む 3 番目のマスクされたものもありますsum...

于 2013-08-14T07:24:07.330 に答える
0

lambda無名関数であり、呼び出し可能です。表記がわかりにくい場合は、名前付き関数に置き換えることができます。

def wrapper():
    return accum(sum, 2)

for sum in iter(wrapper, 40):

引数はv呼び出し可能でなければなりません。の結果accum(sum, 2)は整数であり、呼び出し可能ではありません。

于 2013-08-14T07:23:41.457 に答える