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

3 ответов


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

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

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

редактировать: обратите внимание, что есть планирует поддержать оставшиеся обобщения.


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

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

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

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