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 个元素组成的元组:

返回 -4 的 lambda 字符串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 中的迭代器在第一次迭代时返回函数对象的主要内容,如果未能解决你的问题,请参考以下文章

内联日期选择器在第二次尝试时崩溃

Python学习之旅—Day07(生成器与迭代器)

迭代器在spark中的应用

Python:TypeError:只能在第 9 行分配一个可迭代对象

python -- 迭代器和装饰器

Python函数---王伟---2020-01-06