2013-04-15 11 views
38

क्या कोई संदर्भ कहीं ठीक से परिभाषित करता है जब कोष्ठक के साथ टुपल संलग्न करते हैं या इसकी आवश्यकता नहीं होती है?एक ट्यूपल के आसपास ब्रांड्स की आवश्यकता होती है?

>>> d = {} 
>>> d[0,] = 'potato' 
>>> if 0, in d: 
    File "<stdin>", line 1 
    if 0, in d: 
     ^
SyntaxError: invalid syntax 
+4

उम्मीद कर सकते हैं मैं इसे 'के लिए कि विशेष रूप से दिलचस्प के, डी में: प्रिंट के' उस मामले में काम करता है। –

+0

[पायथन व्याकरण] (http://docs.python.org/2/reference/grammar.html) आपको दिखाएगा कि * क्या * अनुमति है, उदाहरण के लिए, 'if' कथन में।आपको पूर्ण व्याकरण पर पढ़ना होगा कि यह पता लगाने के लिए कि जहां अनपेक्षित tuples स्वीकार किए जाते हैं, यही कारण है कि मैं इसे एक उत्तर के रूप में पोस्ट नहीं कर रहा हूं। – chepner

+0

... मैं यह समझने में असफल रहा कि आप '0' के साथ विफल होने के लिए * आश्चर्यचकित * कैसे हो सकते थे ... ... पायथन पहचानकर्ताओं को एक (यूनिकोड) अक्षर या अंडरस्कोर से शुरू होना चाहिए और '0' मान्य नहीं है पायथन पहचानकर्ता इसलिए मुझे * अपेक्षित * एक 'सिंटेक्स एरर' होगा। – Bakuriu

उत्तर

38

भाव का संयोजन एक टपल अल्पविराम टोकन का उपयोग बनाने के लिए एक expression_list कहा जाता है:

यहाँ एक उदाहरण है कि मुझे हाल ही में हैरान कर दिया है। operator precedence के नियम अभिव्यक्ति सूचियों को शामिल नहीं करते हैं; ऐसा इसलिए है क्योंकि अभिव्यक्ति सूचियां स्वयं अभिव्यक्ति नहीं हैं; जब वे कोष्ठक में संलग्न होते हैं तो वे अभिव्यक्ति बन जाते हैं।

तो, एक unenclosed expression_list अजगर में कहीं भी अनुमति दी है कि यह विशेष रूप से भाषा व्याकरण द्वारा अनुमति दी है, लेकिन जहां इस तरह के रूप में एक expression की आवश्यकता नहीं है

if_stmt ::= "if" expression ":" suite 
      ("elif" expression ":" suite)* 
      ["else" ":" suite] 

क्योंकि उत्पादन expression संदर्भित है, unenclosed expression_list रों if बयान के विषय के रूप में अनुमति नहीं है:

उदाहरण के लिए, if statement के व्याकरण इस प्रकार है। हालांकि, for statement एक expression_list स्वीकार करता है:

for_stmt ::= "for" target_list "in" expression_list ":" suite 
       ["else" ":" suite] 

तो निम्न की अनुमति है:

for x in 1, 2, 3: 
    print(x) 
+2

+1 यह निश्चित रूप से बताता है कि' के लिए, डी 'कार्यों में (क्योंकि' के लिए, डी 'काम में v)। –

+0

प्रश्न: क्या आपको इसे x में 1, 2, 3: 'या 'x में (1, 2, 3) लिखना चाहिए:'? मैंने हमेशा इसे दूसरी तरफ लिखा है, लेकिन ऐसा इसलिए था क्योंकि मुझे नहीं पता था कि जब तक मैंने कोशिश की थी तब तक पहला तरीका वैध था। अब मैं सोच रहा हूं कि '()' अनावश्यक शोर हैं, या यदि वे किसी भी तरह कोड पढ़ने में मदद करते हैं। क्या पीईपी 8 इस पर कोई मार्गदर्शन प्रदान करता है? – ArtOfWarfare

+1

@ArtOfWarfare पीईपी 8 में कोई विशिष्ट मार्गदर्शन नहीं है। यह 'if' कथन के साथ तुलना करने में मदद कर सकता है, जहां केवल एक शर्त के लिए कोष्ठक की अनुशंसा की जाती है जो कई पंक्तियों को फैलाती है। तो: 'x में (1, 2, 3): '। – ecatmur

11

कहीं भी आप expression_list शब्द का उपयोग करने की अनुमति है, तो आप कोष्ठकों का प्रयोग करने की जरूरत नहीं है।

if statement को expression की आवश्यकता है, और expression_list का समर्थन नहीं करता है।

वाक्य रचना के उदाहरण है कि expression_list अनुमति देते हैं:

Expressions, Simple और Compound statements प्रलेखन Grepping expression_list आप सभी स्थान expression_list अजगर व्याकरण में प्रयोग किया जाता है बता देंगे के लिए।

+0

ओह हाँ? '1,2,3 + 4,5' के बारे में कैसे? इसका परिणाम अभिव्यक्ति सूची में नतीजा नहीं है ... – smci

+0

@ एसएमसीआई ने मुझे अपने उत्तर के साथ क्या करना है? आप किस नतीजे की उम्मीद करते थे? –

+0

क्योंकि '1,2,3 + 4,5' अभिव्यक्ति में परिणाम 1,2,7,5' है, जो कि एक आरामदायक पाठक अपेक्षा नहीं करेगा, और अनुक्रम संलग्न करने के लिए '+ 'ओवरलोडिंग से आता है। – smci

1

जब आप अस्पष्टता से बचने के लिए चाहते हैं तो माता-पिता भी आवश्यक हैं।

निम्नलिखित दो अलग अभिव्यक्ति कर रहे हैं ... सिर्फ इसलिए कि कुछ एक 'अभिव्यक्ति सूची' है, अभिव्यक्ति सूची में परिणाम नहीं है कि आप :)

(1, 2, 3) + (4, 5) # results in (1, 2, 3, 4, 5) because + does sequence.extend on the tuples 
1, 2, 3 + 4, 5  # this results in (1, 2, 7, 5) because + adds the elements, since there were no parentheses to protect the separate tuples 
संबंधित मुद्दे