2012-06-10 6 views
7

Come funziona sotto il cofano? Non capisco il motivo per gli errori di seguito:python: quando posso decomprimere un generatore?

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

Sei alla ricerca di [ 'itertools.consume'] (http://docs.python.org/library/itertools.html#recipes)? – katrielalex

+0

Penso che potrebbe cercare 'list (f())' o 'tuple (f())'. –

+0

Siamo spiacenti, volevo sapere come funziona * Generator e dove è possibile utilizzarlo. –

risposta

9

La sintassi *iterable è supportata solo in un elenco di argomenti di una chiamata di funzione (e nelle definizioni di funzione).

In Python 3.x, è possibile utilizzarlo anche sul lato sinistro di una cessione, in questo modo:

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

Edit: Si noti che ci sono plans to support the remaining generalisations.

1

I due errori stanno mostrando la stessa cosa: non è possibile utilizzare * sul lato sinistro di un'espressione.

Non sono sicuro di cosa si aspetta che accada in questi casi, ma non è valido.

4

L'esecuzione di questo in Python 3 fornisce un messaggio di errore più descrittivo.

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