Lambda 作为 Python 中的迭代器在第一次迭代时返回函数对象

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?

Ark*_*tev 6

当你这样做时:

>>> 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)


Swe*_*per 6

我想你可能误解了什么l是。

l 是一个包含 3 个元素的元组:

  • 一个返回 -4 的 lambda
  • 字符串 c
  • 整数 0

当您创建迭代元组的迭代器时,当然第一次调用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())