为什么带参数的函数在迭代器中无法调用?

时间:2013-08-14 07:20:40

标签: python iterator callable

有两个例子。

# 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

为什么lambda函数不会产生错误但是accum函数会产生错误?

提前致谢:)

2 个答案:

答案 0 :(得分:2)

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

以下2几乎相同:

def x():
    return sum + a

x = lambda: sum + a

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

此外,变量的名称有点误导,花了一些时间来弄清楚发生了什么。正好有两个变量称为sum - 一个在accum函数中,另一个在全局范围内。还有第3个蒙版的,包含全局内置函数sum ...

答案 1 :(得分:0)

lambda是一个匿名函数,可以调用。如果符号令人困惑,可以用命名函数替换它:

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

for sum in iter(wrapper, 40):

v参数必须是可调用的。 accum(sum, 2)的结果是一个整数,不可调用。