2012-05-29 16 views
24

जैसा कि बताया जा here, आप (कार्यों में) की तरह चर के एक अज्ञात नंबर खोल के लिए स्टार उपयोग कर सकते हैं, लेकिन केवल अजगर 3 में:अजगर स्टार संस्करण के लिए खोल 2.7

>>> a, *b = (1, 2, 3) 
>>> b 
[2, 3] 
>>> a, *b = (1,) 
>>> b 
[] 

अजगर 2.7, सबसे अच्छा में मैं ऊपर आ सकते हैं के साथ है (भयानक नहीं है, लेकिन कष्टप्रद):

c = (1, 2, 3) 
a, b = c[0], c[1:] if len(c) > 1 else [] 

वहाँ __future__ तरह विभाजन से आयात करने के लिए एक रास्ता है, या मैं अज्ञात-लंबाई अजगर 2.7 में खोल करने के लिए अपने ही समारोह की आवश्यकता होगी?

+4

नहीं। यही कारण है कि कुछ Py3k * केवल * विशेषताओं में से एक है की आवश्यकता होती है लगता है। – JBernardo

+1

इसे विस्तारित अनपॅकिंग –

उत्तर

25

अजगर 2.x में, आप कर सकते हैं:

c = (1, 2, 3) 
a, b = c[0], c[1:] 

जब तक c कम से कम एक सदस्य अगर c केवल 1 बात उस में c[1:][] है इसकी वजह से काम करेंगे है।

आपको शायद यह सुनिश्चित करना चाहिए कि c में कम से कम एक चीज़ है, या अन्य c[0] अपवाद उठाएगा।

try: 
    c = tuple(c) 
    a, b = c[0], c[1:] 
except TypeError, IndexError: 
    # c is not iterable, or c is iterable, but it doesn't have any stuff in it. 
    # do something else 
    pass 
+3

कहा जाता है केवल तभी यदि 'सी' अनुक्रम है। किसी भी पुनरावर्तनीय के साथ काम अनपॅक करना, इसलिए पूर्ण समाधान के लिए, 'c = tuple (c)' पहले करें। यह असीमित पुनरावृत्तियों पर लटकने सहित बिल्कुल व्यवहार को अनुकरण करता है। लेकिन आपको अभी भी 'ए, * बी, सी = रेंज (10)' के लिए कड़ी मेहनत करनी है; लेकिन उसके आस-पास कोई वास्तविक रास्ता नहीं है। – lvc

+0

@lvc अच्छा बिंदु। मैंने अपना जवाब संपादित कर लिया है। – Andbdrew

+2

@ एलवीसी मैन, कि 'ए, * बी, सी = रेंज (10)' बहुत अच्छा है! – Andbdrew

2
(a,b) = (None, []) if not len(c) else (c[0], c[1:]) 

, यह भी इस मामले में जहां ग एक खाली अनुक्रम है से निपटने के लिए एक विकल्प है, हालांकि यह के बीच [कोई नहीं] भेद नही कर सकेगी और [] संदर्भ में:

आप की तरह कुछ कर सकता है ए के लिए असाइनमेंट के रूप में, बी। तो इसे देखभाल के साथ प्रयोग करें, कोशिश करें/छोड़कर शायद सबसे अच्छा है।

मैं खाली कंटेनर को संभालने के दौरान पाइथन 3 और 2.7 के बीच कोई वास्तविक अंतर नहीं देख सकता, लेकिन यहां पाइथन 3 के बारे में अच्छी बात यह है कि यह किसी भी अस्थिर के साथ काम करती है।

यह 2.7 में काम करता है यदि आपको पता है कि सी जनरेटर है।

a,b = c.next(), c 

लेकिन unpacking से भरा सुंदरता पायथन 3.