2012-06-10 20 views
7

Jak to działa pod maską? Nie rozumiem przyczynę poniższych błędów:python: kiedy mogę rozpakować generator?

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

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

+0

Myślę, że mógłby on szukać 'list (f())' lub 'krotki (f())'. –

+0

Przepraszam, bardziej chciałem wiedzieć, jak działa * Generator i gdzie można go użyć. –

Odpowiedz

9

Składnia *iterable jest obsługiwana tylko na liście argumentów wywołania funkcji (oraz w definicjach funkcji).

w Pythonie 3.x, można z niego korzystać także po stronie lewej cesji, tak:

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

Edit: Należy pamiętać, że istnieją plans to support the remaining generalisations.

1

Dwa błędy pokazując to samo: nie można użyć * na lewej stronie wyrażenia.

Nie jestem pewien, co spodziewasz się w takich przypadkach, ale nie jest to ważne.

4

Uruchomienie tego w Pythonie 3 daje bardziej opisowy komunikat o błędzie.

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