2012-06-10 7 views
7

Как это работает под капотом? Я не понимаю причину ошибки ниже:python: когда я могу распаковать генератор?

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

Вы ищете [ 'itertools.consume'] (http://docs.python.org/library/itertools.html#recipes)? – katrielalex

+0

Думаю, он может искать 'list (f())' или 'tuple (f())'. –

+0

Извините, я больше хотел узнать, как работает генератор, и где вы можете его использовать. –

ответ

9

Синтаксис *iterable поддерживается только в списке аргументов вызова функции (и в определениях функций).

В Python 3.x, вы можете также использовать его на левой части присваивания, например:

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

Edit: Обратите внимание, что есть plans to support the remaining generalisations.

1

Две ошибки, показывая то же самое: вы не можете использовать * на левой стороне выражения.

Я не уверен, что вы ожидаете в тех случаях, но это неверно.

4

Выполнение этого в Python 3 дает более подробное сообщение об ошибке.

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