Lea*_*rer 3 python oop lambda python-3.x
我有这个我无法理解的代码片段:
>>> l = lambda: -4, 'c', 0
>>> i = iter(l)
>>> i
<tuple_iterator object at 0x00700CD0>
>>> next(i)
<function <lambda> at 0x0070A4F8>
>>> next(i)
'c'
>>> next(i)
0
>>> next(i)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
Run Code Online (Sandbox Code Playgroud)
为什么它在第一次迭代时返回 lambda 对象,而不是 -4?
当你这样做时:
>>> l = lambda: -4, 'c', 0
Run Code Online (Sandbox Code Playgroud)
l 实际上是一个元组,包含第一项作为 lambda 函数,第二项是字符串,第三项是整数。
它等效于以下内容:
>>> l = (lambda: -4, 'c', 0)
Run Code Online (Sandbox Code Playgroud)
如果你想访问返回的 lambda 函数-4,你应该试试这个:
>>> i = iter(l)
>>> next(i)()
-4
Run Code Online (Sandbox Code Playgroud)
但请注意,它next(i)()仅适用于callable(lambda、函数等)对象。如果next(i)()与字符串对象一起使用,python 将引发TypeError: 'str' object is not callable. 因此,请始终检查该项目是否为callable. IE,
i = iter(l)
item = next(i)
if callable(item):
print(item())
else:
print(item)
Run Code Online (Sandbox Code Playgroud)
我想你可能误解了什么l是。
l 是一个包含 3 个元素的元组:
c当您创建迭代元组的迭代器时,当然第一次调用next将给您一个 lambda!
也许您打算调用 lambda:
next(i)()
Run Code Online (Sandbox Code Playgroud)
或者,也许您打算这样声明l:
l = lambda: (-4, 'c', 0) # you might think you don't need the parentheses, but you do
Run Code Online (Sandbox Code Playgroud)
一个返回元组的 lambda。
然后做iter(l())。