for - enumerate()-ing a un generador en Python
python function introspection (3)
Es incluso más fácil de decir que cualquiera de las sugerencias anteriores:
$ 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>
Si la enumeración no realizó una evaluación perezosa, devolvería [(0,''a''), (1,''b''), (2,''c'')]
o algún equivalente (casi).
Por supuesto, enumerar es realmente solo un generador de fantasía:
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
Me gustaría saber qué sucede cuando paso el resultado de una función de generador a enumerate () de python. Ejemplo:
def veryBigHello():
i = 0
while i < 10000000:
i += 1
yield "hello"
numbered = enumerate(veryBigHello())
for i, word in numbered:
print i, word
¿Es la enumeración iterada perezosamente, o arrastra todo a la primera? Estoy seguro al 99.999% de que es perezoso, ¿puedo tratarlo exactamente igual que la función del generador, o tengo que estar atento a algo?
Es perezoso Es bastante fácil probar que ese es el caso:
>>> 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
Ya que puede llamar a esta función sin salir de las excepciones de memoria, definitivamente es perezoso
def veryBigHello():
i = 0
while i < 1000000000000000000000000000:
yield "hello"
numbered = enumerate(veryBigHello())
for i, word in numbered:
print i, word