Lambda 作为 Python 中的迭代器在第一次迭代时返回函数对象
Posted
技术标签:
【中文标题】Lambda 作为 Python 中的迭代器在第一次迭代时返回函数对象【英文标题】:Lambda as iterator in Python returns function object on first iteration 【发布时间】:2019-11-19 20:21:19 【问题描述】:我有这个我无法理解的代码 sn-p:
>>> 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
>>>
为什么它在第一次迭代时返回 lambda 对象,而不是 -4?
【问题讨论】:
你应该使用next(i)()
。因为next(i)
只返回 lambda 对象。
好的。但是对我在这里所面临的任何解释..?
【参考方案1】:
我想你可能误解了l
是什么。
l
是一个由 3 个元素组成的元组:
c
整数0
当你创建一个遍历元组的迭代器时,当然第一次调用next
会给你一个 lambda!
也许你打算调用 lambda:
next(i)()
或者您可能打算像这样声明l
:
l = lambda: (-4, 'c', 0) # you might think you don't need the parentheses, but you do
返回元组的 lambda。
然后做iter(l())
。
【讨论】:
太好了,感激不尽。【参考方案2】:当你这样做时:
>>> l = lambda: -4, 'c', 0
l
实际上是一个元组,其中第一项是 lambda 函数,第二项是字符串,第三项是整数。
相当于如下:
>>> l = (lambda: -4, 'c', 0)
如果你想访问返回 -4
的 lambda 函数,你应该试试这个:
>>> i = iter(l)
>>> next(i)()
-4
但请注意 next(i)()
仅适用于 callable
(lambda, functions etc) 对象。如果您将next(i)()
与字符串对象一起使用,python 将引发TypeError: 'str' object is not callable
。因此,请始终检查该项目是否为callable
。即,
i = iter(l)
item = next(i)
if callable(item):
print(item())
else:
print(item)
【讨论】:
鹰眼,谢谢。以上是关于Lambda 作为 Python 中的迭代器在第一次迭代时返回函数对象的主要内容,如果未能解决你的问题,请参考以下文章