2012-06-10 15 views
7

¿Cómo funciona debajo del capó? No entiendo la razón de los errores siguientes:python: ¿cuándo puedo descomprimir un generador?

>>> def f(): 
...  yield 1,2 
...  yield 3,4 
... 
>>> *f() 
    File "<stdin>", line 1 
    *f() 
    ^
SyntaxError: invalid syntax 
>>> zip(*f()) 
[(1, 3), (2, 4)] 
>>> zip(f()) 
[((1, 2),), ((3, 4),)] 
>>> *args = *f() 
File "<stdin>", line 1 
    *args = *f() 
    ^
SyntaxError: invalid syntax 
+0

¿Está buscando [ 'itertools.consume'] (http://docs.python.org/library/itertools.html#recipes)? – katrielalex

+0

Creo que podría estar buscando 'list (f())' o 'tuple (f())'. –

+0

Lo siento, estaba más queriendo saber cómo funciona * Generator, y dónde puede usarlo. –

Respuesta

9

La sintaxis *iterable solo se admite en una lista de argumentos de una llamada a función (y en las definiciones de funciones).

En Python 3.x, también se puede utilizar en el lado izquierdo de una asignación, como esto:

[*args] = [1, 2, 3] 

Editar: Tenga en cuenta que hay plans to support the remaining generalisations.

1

Los dos errores están mostrando lo mismo: no se puede utilizar * en el lado izquierdo de una expresión.

No estoy seguro de lo que espera que ocurra en esos casos, pero no es válido.

4

Al ejecutar esto en Python 3 se obtiene un mensaje de error más descriptivo.

>>> *f() 
SyntaxError: can use starred expression only as assignment target 
Cuestiones relacionadas