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


88

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

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

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

枚举是延迟进行的迭代,还是将所有内容都拖入了第一个?我99.999%的人肯定它是惰性的,所以我可以将它与生成器函数完全一样对待,还是需要注意任何事情?


1
我认为您的意思是在veryBigHello中增加i。
罗伯特2010年

@robert:如果我没有记错的话,我会自动增加
the_drow

@the_drow不在veryBigHello函数本身中。
Will McCutchen

1
@Will:哦,是的。但这只是挑剔。这是一个例子。仍然固定。
the_drow

Answers:


103

很懒 很容易证明是这种情况:

>>> 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

这是Python 2还是3(或两者)?两者都懒吗?我测试了Python 2里,它懒惰。
becko '16

2
我在Python 3.5.2上对此进行了测试,它的计算比较懒惰。
gobernador

42

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

$ 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>

如果枚举没有执行惰性评估,它将返回[(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

2
感谢您的解释。我很难找出可以接受的答案。至少直到我看到你的为止。
trendetter37'3

13

由于您可以在不脱离内存异常的情况下调用此函数,因此它肯定是懒惰的

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

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

0

自从我在使用其他人(sklearn)编写的生成器后,这在旧方法中是不可行的。

i=(-1)
for x in some_generator:
    i+=1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.