枚举() - 用Python生成一个生成器

Ada*_*dam 70 python iterator generator enumerate

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

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

numbered = enumerate(veryBigHello())
for i, word in numbered:
    print i, word
Run Code Online (Sandbox Code Playgroud)

枚举是否是懒惰地迭代,还是将所有内容都插入第一个?我99.999%肯定它很懒,所以我可以把它当作生成器功能完全相同,还是我需要注意什么?

Dav*_*ebb 82

这很懒惰.证明这种情况很容易:

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • 我在Python 3.5.2上进行了测试,它的计算比较懒惰。 (2认同)

Way*_*ner 38

它比以前的任何一个建议更容易分辨:

$ 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>
Run Code Online (Sandbox Code Playgroud)

如果枚举没有执行延迟评估,它将返回[(0,'a'), (1,'b'), (2,'c')]或一些(几乎)等效.

当然,枚举实际上只是一个奇特的生成器:

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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的解释.我有点难以找出接受的答案.至少在我看到你之前. (2认同)

Nik*_*ohl 12

既然你可以在没有内存异常的情况下调用这个函数,那么它肯定是懒惰的

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

numbered = enumerate(veryBigHello())
for i, word in numbered:
    print i, word
Run Code Online (Sandbox Code Playgroud)