सूची में अल्पविरामों को अनुमति क्यों दी जाती है?


135

मैं उत्सुक हूं कि क्यों पायथन में एक सूची में एक अल्पविराम अल्पकालिक सिंटैक्स है, और ऐसा लगता है कि पायथन केवल इसे अनदेखा करता है:

>>> ['a','b',]
['a', 'b']

यह समझ में आता है कि कब से एक टपल है ('a')और ('a',)दो अलग-अलग चीजें हैं, लेकिन सूचियों में?



7
सी, सी ++, जावा, जावास्क्रिप्ट, आदि की सूचियों में एक अनुगामी अल्पविराम की भी अनुमति है
नायुकी

जवाबों:


223

मुख्य लाभ यह है कि यह बहु-पंक्ति सूचियों को संपादित करना आसान बनाता है और यह भिन्नता में अव्यवस्था को कम करता है।

बदल रहा है:

s = ['manny',
     'mo',
     'jack',
]

सेवा:

s = ['manny',
     'mo',
     'jack',
     'roger',
]

अंतर में केवल एक-पंक्ति परिवर्तन शामिल है:

  s = ['manny',
       'mo',
       'jack',
+      'roger',
  ]

यह अधिक भ्रामक मल्टी-लाइन धड़कता है जब अनुगामी अल्पविराम छोड़ा गया था:

  s = ['manny',
       'mo',
-      'jack'
+      'jack',
+      'roger'
  ]

बाद का अंतर यह देखना कठिन बनाता है कि केवल एक पंक्ति को जोड़ा गया था और दूसरी पंक्ति ने सामग्री को नहीं बदला।

ऐसा करने के जोखिम को भी कम करता है:

s = ['manny',
     'mo',
     'jack'
     'roger'  # Added this line, but forgot to add a comma on the previous line
]

और परिणामी स्ट्रिंग शाब्दिक संयोजन को ट्रिगर s = ['manny', 'mo', 'jackroger']करना, इच्छित परिणाम के बजाय उत्पादन करना।


6
यह (सबसे अधिक) समझ में आता है, लेकिन मुझे वास्तव में आश्चर्य होगा अगर भाषा के पार्सर को अलग-अलग आसान बनाने के लिए डिज़ाइन किया गया था।
बुरहान खालिद

94
@BurhanKhalid: भाषा डिजाइनर प्रोग्रामर हैं, और प्रोग्रामर अपने जीवन को आसान बनाने के लिए कई काम करते हैं।
ग्रेग हेविगेल

10
@ बुरहान यदि आप उस स्पष्टीकरण पर विश्वास नहीं करते हैं, तो इस बारे में कि व्याकरण को इस तरह परिभाषित करना कितना सरल है? ;) तुलना List = "[" {Item ","} "]".बनामList = "[" ({Item","}Item|)"]".
जू जूल 22'12

23
यह अन्य कार्यक्रमों के लिए ऑटोजेनरेट कोड को भी आसान बनाता है - "\"item\","प्रत्येक आइटम के लिए प्रिंट करना बहुत आसान है, क्योंकि इसके लिए प्रत्येक आइटम के लिए प्रिंट करना है "\"item\"", ","लेकिन सभी अंतिम आइटम के लिए।
एडम रोसेनफील्ड

9
@Voo मैंने भी ऐसा ही सोचा था लेकिन बाद के व्याकरण को वैसे भी परिभाषित किया जाना चाहिए क्योंकि यह अभी भी एक मान्य पायथन सूची है।
अलेक्जेंडर सुराफेल

34

सरणी में अल्पविरामों की अनुमति देने के लिए यह एक सामान्य वाक्यविन्यास सम्मेलन है, सी और जावा जैसी भाषाओं की अनुमति है, और पायथन ने अपनी सूची डेटा संरचना के लिए इस सम्मेलन को अपनाया है। किसी सूची को पॉप्युलेट करने के लिए कोड जनरेट करते समय यह विशेष रूप से उपयोगी होता है: बस तत्वों और अल्पविरामों का एक क्रम उत्पन्न करते हैं, अंतिम को एक विशेष मामले के रूप में विचार करने की कोई आवश्यकता नहीं है जो अंत में अल्पविराम नहीं होना चाहिए।


30

यह एक खास तरह के बग को खत्म करने में मदद करता है। कभी-कभी कई लाइनों पर सूची लिखना स्पष्ट होता है। लेकिन बाद में, मुख्य आधार पर आप वस्तुओं को पुनर्व्यवस्थित करना चाह सकते हैं।

l1 = [
        1,
        2,
        3,
        4,
        5
]

# Now you want to rearrange

l1 = [
        1,
        2,
        3,
        5
        4,
]

# Now you have an error

लेकिन अगर आप ट्रेलिंग कॉमा की अनुमति देते हैं, और उनका उपयोग करते हैं, तो आप आसानी से त्रुटि की शुरुआत किए बिना लाइनों को पुनर्व्यवस्थित कर सकते हैं।


1
यह साफ-सुथरा है, लेकिन अल्पविराम से पहले से लंबित होने से आप इससे बच सकते हैं। मैं हर समय SQL
बुरहान खालिद

38
यहां तक ​​कि अगर आप प्रत्येक तत्व के लिए अल्पविराम प्रस्तुत करते हैं, तो भी आपको पहले वाले अल्पविराम को छोड़ना होगा।
ग्रेग हेविगेल

एक लिंटर इसे पकड़ने में सक्षम होना चाहिए, नहीं?
viki.omega9

6

एक टपल अलग है क्योंकि ('a')अंतर्निहित निरंतरता का उपयोग करके विस्तारित किया जाता है और ()एक पूर्ववर्ती ऑपरेटर के रूप में होता है, जबकि ('a',)एक लंबाई 1 टपल को संदर्भित करता है।

आपका मूल उदाहरण रहा होगा tuple('a')


('a'),एक तार है; लेकिन मेरा कहना यह था कि टुपल्स में टकराना कॉमास महत्वपूर्ण हैं, लेकिन सूचियों में वे अभी तक प्रकट नहीं होते हैं कि पायथन उन्हें स्वीकार करता है।
बुरहान खालिद

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

tuple('a')शायद एक बुरा उदाहरण है, क्योंकि सामान्य रूप से tuple(x)और (x,)एक ही चीज नहीं हैं। tuple('ab') != ('ab',)tuple('a') == ('a',)केवल इसलिए 'a'कि लंबाई की एक स्ट्रिंग है 1.
chepner

REPL से: >>> ("a",) == ("a") झूठी >>> ("ab",) == ("ab") झूठी >>> ("ab", "bc",) == ("ab", "bc") सच
Seraphya

1

मुख्य कारण कम जटिल बनाना है। उदाहरण के लिए आपके पास एक सूची है:

list = [
    'a',
    'b',
    'c'
]

और आप इसमें एक और तत्व जोड़ना चाहते हैं। तब आप ऐसा करते हुए समाप्त हो जाएंगे:

list = [
    'a',
    'b',
    'c',
    'd'
]

इस प्रकार, अंतर यह दिखाएगा कि दो रेखाओं को बदल दिया गया है, पहले 'c' के साथ ',' जोड़कर और अंतिम पंक्ति में 'd' जोड़ रहे हैं।

तो, अजगर अतिरिक्त सूची को रोकने के लिए सूची के अंतिम तत्व में '' अनुगामी होने की अनुमति देता है, जिससे भ्रम पैदा हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.