2012-06-10 6 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] 

編集plans to support the remaining generalisationsがあることに注意してください。

1

2つのエラーは、同じことを示している:私は以下のエラーの理由を理解していないあなたは、式の左側に*を使用することはできません。

私は、あなたがそのような場合に起こることを期待しているかどうかはわかりませんが、それは無効です。

4

これをPython 3で実行すると、よりわかりやすいエラーメッセージが表示されます。

>>> *f() 
SyntaxError: can use starred expression only as assignment target 
関連する問題