0

There are two examples.

# 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

Why lambda function doesn't make error but accum function makes error?

Thanks in advance :)

4

2 回答 2

2

在这两种情况下,您都传递了一个带参数的函数。在第二种情况下, 的值v绑定到整数2,而在第一种情况下,v指的是可调用的匿名 lambda 函数() -> sum + a

以下 2 几乎是等价的:

def x():
    return sum + a

x = lambda: sum + a

除了 lambda 不提供很好的调试回溯,因为 lambda 函数未命名。

此外,变量的名称有点误导,我花了一些时间来弄清楚发生了什么。恰好有 2 个变量被调用sum- 一个在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 回答