2012-06-10 17 views
7

यह हुड के नीचे कैसे काम करता है?पायथन: मैं जनरेटर को कब अनपैक कर सकता हूं?

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

मुझे लगता है कि वह 'सूची (एफ()) 'या' tuple (f()) 'की तलाश कर रहा है। –

+0

क्षमा करें, मैं जानना चाहता था कि * जनरेटर कैसे काम करता है, और आप इसका उपयोग कहां कर सकते हैं। –

उत्तर

9

*iterable वाक्यविन्यास केवल फ़ंक्शन कॉल (और फ़ंक्शन परिभाषाओं में) की एक तर्क सूची में समर्थित है।

अजगर 3.x में, आप भी एक काम के बाएं हाथ की ओर पर इसका इस्तेमाल कर सकते हैं, इस तरह:

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

संपादित: ध्यान दें कि ऐसे plans to support the remaining generalisations हैं कि।

1

दो त्रुटियों एक ही बात दिखा रहे हैं: मैं नीचे दी गई त्रुटियों का कारण समझ में नहीं आता कि आप एक अभिव्यक्ति के बाएं हाथ की ओर पर * उपयोग नहीं कर सकते।

मुझे यकीन नहीं है कि आप उन मामलों में क्या होने की उम्मीद कर रहे हैं, लेकिन यह मान्य नहीं है।

4

पायथन 3 में इसे चलाने से एक और वर्णनात्मक त्रुटि संदेश मिलता है।

>>> *f() 
SyntaxError: can use starred expression only as assignment target 
संबंधित मुद्दे