我想知道当我将生成器函数的结果传递给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%肯定它是懒惰的,所以我可以将它与生成器功能完全相同,还是我需要注意什么?
答案 0 :(得分:77)
很懒。证明情况相当容易:
>>> 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
答案 1 :(得分:35)
比之前提出的建议更容易分辨:
$ 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 :(得分:12)
既然你可以调用这个函数而不会出现内存异常,那肯定是懒惰的
def veryBigHello():
i = 0
while i < 1000000000000000000000000000:
yield "hello"
numbered = enumerate(veryBigHello())
for i, word in numbered:
print i, word
答案 3 :(得分:0)
由于我使用的是其他人(sklearn)编写的生成器而无法使用此处的方法的旧式替代方法。
i=(-1)
for x in some_generator:
i+=1