发电机输出长度

新手上路,请多包涵

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 许可协议

阅读 346
2 个回答

没有一个是因为在一般情况下你不能这样做——如果你有一个惰性的无限生成器怎么办?例如:

 def fib():
    a, b = 0, 1
    while True:
        a, b = b, a + b
        yield a

这永远不会终止,但会生成斐波那契数列。您可以通过调用 next() 获得任意数量的斐波那契数列。

如果你真的需要知道项目的数量,那么无论如何你都不能线性迭代它们一次,所以只需使用不同的数据结构,比如常规列表。

原文由 Adam Rosenfield 发布,翻译遵循 CC BY-SA 3.0 许可协议

最简单的方法可能就是 sum(1 for _ in gen) 其中 gen 是您的生成器。

原文由 Matt Dunham 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏