enumerate() - 在 Python 中生成一个生成器

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3396279/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-18 10:50:17  来源:igfitidea点击:

enumerate()-ing a generator in Python

pythoniteratorgeneratorenumerate

提问by Adam

I'd like to know what happens when I pass the result of a generator function to python's enumerate(). Example:

我想知道当我将生成器函数的结果传递给 python 的 enumerate() 时会发生什么。例子:

def veryBigHello():
    i = 0
    while i < 10000000:
        i += 1
        yield "hello"

numbered = enumerate(veryBigHello())
for i, word in numbered:
    print i, word

Is the enumeration iterated lazily, or does it slurp everything into the first? I'm 99.999% sure it's lazy, so can I treat it exactly the same as the generator function, or do I need to watch out for anything?

枚举是懒惰地迭代,还是将所有内容都放入第一个?我 99.999% 确定它是懒惰的,所以我可以将它与生成器函数完全相同,还是需要注意什么?

采纳答案by Dave Webb

It's lazy. It's fairly easy to prove that's the case:

它很懒。很容易证明情况确实如此:

>>> def abc():
...     letters = ['a','b','c']
...     for letter in letters:
...         print letter
...         yield letter
...
>>> numbered = enumerate(abc())
>>> for i, word in numbered:
...     print i, word
...
a
0 a
b
1 b
c
2 c

回答by Nikolaus Gradwohl

Since you can call this function without getting out of memory exceptions it definitly is lazy

由于您可以调用此函数而不会出现内存不足异常,因此它绝对是懒惰的

def veryBigHello():
    i = 0
    while i < 1000000000000000000000000000:
        yield "hello"

numbered = enumerate(veryBigHello())
for i, word in numbered:
    print i, word

回答by Wayne Werner

It's even easier to tell than either of the previous suggest:

比之前的任何一个建议都更容易判断:

$ python
Python 2.5.5 (r255:77872, Mar 15 2010, 00:43:13)
[GCC 4.3.4 20090804 (release) 1] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> abc = (letter for letter in 'abc')
>>> abc
<generator object at 0x7ff29d8c>
>>> numbered = enumerate(abc)
>>> numbered
<enumerate object at 0x7ff29e2c>

If enumerate didn't perform lazy evaluation it would return [(0,'a'), (1,'b'), (2,'c')]or some (nearly) equivalent.

如果 enumerate 没有执行惰性求值,它将返回[(0,'a'), (1,'b'), (2,'c')]或一些(几乎)等价的。

Of course, enumerate is really just a fancy generator:

当然, enumerate 实际上只是一个花哨的生成器:

def myenumerate(iterable):
   count = 0
   for _ in iterable:
      yield (count, _)
      count += 1

for i, val in myenumerate((letter for letter in 'abc')):
    print i, val