Python 提供了一种很好的方法来获取急切迭代的长度,即 len(x)
。但是对于由生成器理解和函数表示的惰性迭代器,我找不到任何类似的东西。当然,写这样的东西并不难:
def iterlen(x):
n = 0
try:
while True:
next(x)
n += 1
except StopIteration: pass
return n
但我无法摆脱我正在重新实现自行车的感觉。
(当我输入这个函数时,一个想法闪过我的脑海:也许真的没有这样的函数,因为它“破坏”了它的参数。不过对我来说这不是问题)。
PS:关于第一个答案 - 是的,类似 len(list(x))
的东西也可以,但这会大大增加内存的使用。
PPS:重新检查…无视 PS,似乎我在尝试时犯了一个错误,它工作正常。抱歉,添麻烦了。
原文由 Maxim 发布,翻译遵循 CC BY-SA 4.0 许可协议
没有一个是因为在一般情况下你不能这样做——如果你有一个惰性的无限生成器怎么办?例如:
这永远不会终止,但会生成斐波那契数列。您可以通过调用
next()
获得任意数量的斐波那契数列。如果你真的需要知道项目的数量,那么无论如何你都不能线性迭代它们一次,所以只需使用不同的数据结构,比如常规列表。