【问题标题】:Lambda as iterator in Python returns function object on first iterationLambda 作为 Python 中的迭代器在第一次迭代时返回函数对象
【发布时间】: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 对象。
  • 好的。但是对我在这里所面临的任何解释..?

标签: python python-3.x oop 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)

【讨论】:

  • 鹰眼,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2020-01-03
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 2011-05-17
相关资源
最近更新 更多