इस अजगर स्निपेट में अर्धविराम की अनुमति क्यों है?


166

पायथन बयान समाप्त करने के लिए अर्धविराम के उपयोग का वारंट नहीं करता है। तो यह (नीचे) अनुमति क्यों है?

import pdb; pdb.set_trace()

1
ध्यान दें कि इस तरह के कोड केवल डिबगिंग उद्देश्यों के लिए blatantly है और संभवतः इसे "किए जाने" से पहले excised किया जाएगा। मैं उस स्निपेट का उपयोग करता हूं, जैसा कि आपके पास है इसलिए मैं इसे आसानी से इधर-उधर कर सकता हूं।
Nick T

Lol मैं एक ही वेबसाइट से इस सवाल पर आया था: realpython.com/python-debugging-pdb
mackycheese21

जवाबों:


226

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

अब, इसकी अनुमति क्यों है? यह एक सरल डिजाइन निर्णय है। मुझे नहीं लगता कि पायथन को इस अर्ध-औपनिवेशिक चीज़ की ज़रूरत है, लेकिन किसी ने सोचा कि यह अच्छा होगा और इसे भाषा में जोड़ा जाएगा।


16
यह ऐसी चीजों के लिए उपयोगी है जैसेtimeit a = 5; a*a
1913 को एंडोलिथ

13
यह निष्पादन कथनों के लिए उपयोगी लगता है जैसे कि निष्पादन ('in a [1,2,3]: a, Print a + 1')
Phil C

76
मैं सी, ओबज-सी, जावास्क्रिप्ट, पीएचपी की पृष्ठभूमि के साथ पायथन में आया हूं। मैं अक्सर (बेकार) टर्मिनेटर डालता हूं; एक पंक्ति के अंत में। लेकिन सौभाग्य से पाइथन ने मुझे माफ कर दिया
पाओलो

36
डेजांगो शेल, या डीबगर में अर्धविराम अत्यधिक उपयोगी है, इसलिए आप एक ही लाइन पर एक छोटा प्रोग्राम लिख सकते हैं और बाद में इसे दोहरा सकते हैं।
ब्राइस

5
@endolith क्या timeitमतलब है? अभी भी 2 के a = 2; a*aबाद से बेकार aहै; यह होना ही होगाa = 2; a *= a
नीरो

59

http://docs.python.org/reference/compound_stmts.html

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

if test1: if test2: print x

यह भी ध्यान दें कि अर्धविराम इस संदर्भ में बृहदान्त्र की तुलना में अधिक सख्त है, ताकि निम्नलिखित उदाहरण में, या तो सभी या प्रिंट विवरणों में से कोई भी निष्पादित न हो:

if x < y < z: print x; print y; print z 

सारांश:

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | funcdef
                   | classdef
                   | decorated
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]

4
एक के बाद बृहदान्त्र की तुलना में अर्धविराम की प्राथमिकता के बारे में पता नहीं था। धन्यवाद!
गाबोरस

3
@ विस्तृत रूप से मुझे व्यक्तिगत रूप से आपकी टिप्पणी अस्पष्ट लगती है जिससे मुझे लगा कि आप दूसरे तरीके का मतलब निकालेंगे। इसलिए, स्पष्ट करने के लिए, मैं अन्य पाठकों को सुझाव if cond: stmt1; stmt2; stmt3
दूंगा

हां, जो मेरा मतलब था, यदि प्राथमिकता कम है, तो लेसर माता-पिता (बृहदान्त्र) को तब तक नहीं छोड़ सकता, जब तक कि सभी अर्धविराम बयान निष्पादित नहीं हो जाते। यह वास्तव में एक स्पष्ट बात नहीं है।
गाबोरस

38

अजगर ;एक विभाजक के रूप में उपयोग करता है , न कि एक टर्मिनेटर के रूप में। आप उन्हें एक पंक्ति के अंत में भी उपयोग कर सकते हैं, जो उन्हें स्टेटमेंट टर्मिनेटर की तरह दिखता है , लेकिन यह केवल कानूनी है क्योंकि पायथन में रिक्त बयान कानूनी हैं - एक पंक्ति जिसमें अंत में अर्धविराम शामिल है, दो कथन हैं, दूसरा एक खाली।


28
यदि आप अंत में (या कहीं भी) डबल अर्धविराम लगाते हैं, तो आपको एक सिंटेक्सऑयर मिलता है। तो ऐसा लगता है कि खाली बयान पूरी तरह से कानूनी नहीं हैं।
कुकु

10
संभवतः इसके पास सूचियों, टुपल्स के समान तर्क हैं, अनुगामी अल्पविराम के साथ डीकट्स वैध हैं और उनके छंटनी समकक्षों (जैसे [1,2,3] == [1,2,3]]) के समान हैं, लेकिन उनमें दोहरा अल्पविराम नहीं हो सकता है । तो मूल रूप से पायथन में एक "ट्रेलिंग ब्लो रिमूवर" है। जो इस तरह से स्पष्ट है:stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
Cucu

@Cucu तुम सही हो। आप अर्धविराम के साथ एक पंक्ति भी शुरू नहीं कर सकते हैं, या एक अल्पविराम के साथ एक अभिव्यक्ति सूची शुरू कर सकते हैं। इसलिए यह कहना अधिक सटीक है कि अर्धविराम और अल्पविराम विभाजक और वैकल्पिक टर्मिनेटर हैं।
वंजेंड्रिया

29

दुभाषिया में अर्धविराम

उत्तर पढ़ने के बाद, मुझे अभी भी अर्धविराम के उपयोग के एक महत्वपूर्ण पहलू की याद आती है, संभवतः केवल एक ही जहां यह वास्तव में एक अंतर बनाता है ...

जब आप एक दुभाषिया REPL (पायथन इंटरेक्टिव शेल, IDLE, ipython) में काम कर रहे होते हैं, तो अंतिम अभिव्यक्ति का मान स्क्रीन पर प्रिंट हो जाता है और आमतौर पर यह इच्छित व्यवहार होता है।

साइड इफेक्ट के लिए एक अभिव्यक्ति का उपयोग करना

लेकिन कुछ मामलों में आप केवल इसके दुष्प्रभावों के लिए एक अभिव्यक्ति का मूल्यांकन करना चाहते हैं, उदाहरण के लिए, आपके द्वारा दिए गए सिमुलेशन के परिणामों को देखने के लिए matplotlib

इस मामलों में आप (शायद) के screenful को देखने के लिए नहीं करना चाहती reprकी रों matplotlibवस्तुओं है कि कभी कभी एक के लिए एक कॉल द्वारा दिया जाता है matplotlibकम से कम IPython में समारोह और,, संभावनाओं आप से एक के लिए एक अर्धविराम संलग्न करने के लिए है ज्यादा वर्बोज़ स्टेटमेंट, अब IPython इनपुट लाइन को दो अभिव्यक्तियों, matplotlibआह्वान और एक अशक्त कथन के रूप में देखता है , ताकि यौगिक अभिव्यक्ति का मूल्य हो Noneऔर इंटरप्रेटर द्वारा स्क्रीन पर कुछ भी नहीं छपा हो (अन्य संभावना असाइनमेंट के रूप में, _ = plot(...)लेकिन मुझे लगता है कि थोड़ा और घुसपैठ)।

व्यक्तिगत टिप्पणी

IMHO, इंटरप्रेटर में वांछित आउटपुट को दबाने के लिए अर्धविराम का उपयोग IPyton नोटबुक की शुरुआत के बाद अधिक प्रासंगिक हो गया है, जो इनपुट और आउटपुट को सहेजने की अनुमति देता है, जिसमें दस्तावेज़ीकरण और अंततः पुन: उपयोग के लिए एक इंटरप्रिटेशन सत्र का आलेखीय आउटपुट भी शामिल है। ।


मैं देख रहा हूँ, साझा करने के लिए धन्यवाद! यह सिर्फ मेरी समस्या को हल करता है, जहां अर्धविराम को ipython नोटबुक में matplotlib द्वारा repr को रोका जा सकता है
नेपिटुपुलु जॉन

यह एक IPython- केवल सुविधा है, और यह एक शून्य कथन नहीं है, बस एक विशेष वाक्यविन्यास है।
वंडारेड

@wjandrea आप सही हैं, यह सिर्फ ipython... मैंने आपकी टिप्पणी को प्रतिबिंबित करने के लिए अपना उत्तर संपादित किया है।
गॉबोफी

यह उत्तर अधिक होना चाहिए, क्योंकि मुझे लगता है कि यह सबसे आम उपयोग का मामला बन गया है (जुपिटर नोटबुक + आईपीथॉन वर्कफ़्लो के प्रसार के साथ)
जोश फ्रीडलैंडर

12

जैसा कि बाकी सभी ने नोट किया है, आप अलग-अलग बयानों के लिए अर्धविराम का उपयोग कर सकते हैं। आपके पास नहीं है , और यह सामान्य शैली नहीं है।

जैसे कि यह क्यों उपयोगी है, कुछ लोग एक ही लाइन पर दो या दो से अधिक वास्तव में तुच्छ छोटे बयान रखना पसंद करते हैं (व्यक्तिगत रूप से मुझे लगता है कि यह कई तुच्छ आसानी से एक जटिल-दिखने वाली रेखा में स्किम्ड लाइनों को बदल देता है और यह देखना कठिन है कि यह तुच्छ है ।

लेकिन यह लगभग एक आवश्यकता है जब आप पायथन का उपयोग करके शेल से एक लाइनर को आमंत्रित कर रहे हैं python -c '<some python code>'। यहां आप अलग-अलग बयानों के लिए इंडेंटेशन का उपयोग नहीं कर सकते हैं , इसलिए यदि आपका वन-लाइनर वास्तव में एक दो-लाइनर है, तो आपको अर्धविराम का उपयोग करने की आवश्यकता होगी। और यदि आप अपने वन-लाइनर में अन्य तर्कों का उपयोग करना चाहते हैं, तो आपको प्राप्त करने के लिए आयात sysकरना होगा sys.argv, जिसके लिए एक अलग importकथन की आवश्यकता होती है । जैसे

python -c "import sys; print ' '.join(sorted(sys.argv[1:]))" 5 2 3 1 4
1 2 3 4 5

2
शेल में कमांड पास करते समय आप इंडेंटेशन और न्यूलाइन्स का उपयोग कर सकते हैं python: बस अपने उद्धृत कोड को कई लाइनों पर फैलाएं या एक हेरेडोक का उपयोग करें। फिर भी, अगर आप चाहते हैं कि यह "वन-लाइनर" हो जाए। ;)
00dani

रेल उत्तर के लिए लक्षण शामिल हैं-c
n611x007

6

मुझे लगता है कि मैं एक पुराने सी प्रोग्रामर के रूप में पक्षपाती हूं, लेकिन ऐसे समय होते हैं जब विभिन्न पायथन सम्मेलनों में चीजों का पालन करना मुश्किल हो जाता है। मुझे इंडेंट कन्वेंशन में कई बार गुस्सा आता है।

कभी-कभी, जब एक बयान या ब्लॉक समाप्त होने की स्पष्टता बहुत उपयोगी होती है। मानक सी कोड अक्सर कुछ इस तरह से पढ़ा जाएगा:

for(i=0; i<100; i++) {
    do something here;
    do another thing here;
}

continue doing things;

जहाँ आप बहुत स्पष्टता के लिए व्हाट्सएप का उपयोग करते हैं - और यह देखना आसान है कि लूप कहाँ समाप्त होता है।

पायथन आपको एक (वैकल्पिक) अर्धविराम के साथ समाप्त करने देता है। जैसा कि ऊपर उल्लेख किया गया है, इसका मतलब यह नहीं है कि 'शून्य' कथन के बाद निष्पादित करने के लिए एक बयान है। एसओ, उदाहरण के लिए,

print(x);
print(y);

के समान है

print(x)
print(y)

यदि आप मानते हैं कि पहले वाले के पास प्रत्येक पंक्ति के अंत में एक अशक्त कथन है, तो कोशिश करें - जैसा कि सुझाव दिया गया है - यह कर:

print(x);;

यह एक सिंटैक्स त्रुटि फेंक देगा।

निजी तौर पर, मैं कोड को अधिक पठनीय बनाने के लिए अर्धविराम ढूंढता हूं जब आपके पास कई तर्क और / या लंबे नाम वाले आर्ग के साथ बहुत सारे नेस्टिंग और फ़ंक्शन होते हैं। इसलिए, मेरी नज़र में, यह अन्य विकल्पों की तुलना में बहुत अधिक स्पष्ट है:

if some_boolean_is_true:
    call_function(
        long_named_arg_1,
        long_named_arg_2,
        long_named_arg_3,
        long_named_arg_4
    );

मेरे बाद से, यह आपको बताता है कि अंतिम ')' कुछ 'ब्लॉक' को समाप्त करता है जो कई लाइनों पर चलता है।

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

मुझे यकीन है कि मुझे कुछ डेडहार्ड्स से मिलाया जाएगा, लेकिन कंपाइलर / दुभाषिया को परवाह नहीं है कि तर्कों के लंबे या छोटे नाम हैं, और - लेकिन पायथन में इंडेंटेशन कन्वेंशन के लिए - व्हाट्सएप के बारे में परवाह नहीं है। कोड के साथ सबसे बड़ी समस्या दूसरे मानव (और यहां तक ​​कि काम के महीनों के बाद भी) को समझने के लिए स्पष्टता दे रही है कि क्या चल रहा है, जहां चीजें शुरू होती हैं और समाप्त होती हैं, आदि।



5

" व्हेन पाइथन्स अटैक " का एक उद्धरण

अर्धविराम के साथ अपने सभी कथनों को समाप्त न करें। यह पायथन में ऐसा करने के लिए तकनीकी रूप से कानूनी है, लेकिन पूरी तरह से बेकार है जब तक कि आप एक लाइन पर एक से अधिक स्टेटमेंट नहीं डाल रहे हैं (जैसे, x = 1; y = 2; z = 3)।


4
क्यों नहीं x,y,z = 1,2,3?
अनिर्बान नाग 'टिनटिनम'

5
@ AnirbanNag'tintinmj 'इस विशेष मामले में, मेरा मानना x, y, z = 1, 2, 3है कि यह धीमा है क्योंकि यह एक ट्यूल के निर्माण की अनावश्यक दौर यात्रा को उकसाता है और फिर तुरंत इसे जैसा दिखता है। (वैसे, मुझे वास्तव में नहीं लगता कि @communistpancake x=1; y=2; z=3पैटर्न का सुझाव दे रहा है। मुझे लगता है कि वह / वह केवल एक उदाहरण दे रहे हैं कि अर्धविराम एक टर्मिनेटर के बजाय एक विभाजक कैसे है।)
रेयोलू

1
@AnirbanNag - क्योंकि यह एक बहु-बयान लाइन का एक बकवास उदाहरण रहा होगा।
cz

4

एक पंक्ति में कई बयानों में अर्धविराम को विभाजक के रूप में शामिल किया जा सकता है। उदाहरण के लिए: http://docs.python.org/reference/compound_stmts.html आपके मामले में, यह डिबगर में टूटने के लिए एक बिंदु की आसान प्रविष्टि के लिए बनाता है।

साथ ही, लर्निंग पाइथन बुक में मार्क लुट्ज़ द्वारा उल्लेख किया गया है , यह अर्धविराम के साथ आपके सभी बयानों को समाप्त करने के लिए तकनीकी रूप से कानूनी (हालांकि अनावश्यक और कष्टप्रद) है ।


3

यदि आप एक पंक्ति में एक से अधिक कथन शामिल करते हैं, तो पायथन आपको एक बयान के अंत को दर्शाने के लिए एक अर्ध-उपनिवेश का उपयोग करने देता है।


2

अर्धविराम का उपयोग एक पंक्ति दो या अधिक कमांड के लिए किया जा सकता है। उनका उपयोग करने की आवश्यकता नहीं है, लेकिन वे प्रतिबंधित नहीं हैं।

अर्धविराम (;) दिए गए सिंगल लाइन पर कई स्टेटमेंट देता है कि न तो स्टेटमेंट एक नया कोड ब्लॉक शुरू करता है।

http://www.tutorialspoint.com/python/python_basic_syntax.htm


2

अर्धविराम (जैसे डॉट्स, कॉमा और कोष्ठक) धार्मिक युद्धों का कारण बनते हैं। फिर भी, वे (या कुछ समान प्रतीक) विभिन्न कारणों से किसी भी प्रोग्रामिंग भाषा में उपयोगी हैं।

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

  • अवधारणात्मक: शुद्ध वाक्य रचना (इस मामले में, आदेशों के अनुक्रम के लिए) के बीच की चिंताओं को अलग करना प्रस्तुति से (उदाहरण के लिए नईलाइन), पुराने दिनों में "सुंदर-छपाई" कहा जाता है।

अवलोकन: हाइलाइटिंग संरचना के लिए, इंडेंटेशन को स्पष्ट तरीके से ऊर्ध्वाधर लाइनों द्वारा बढ़ाया / बदला जा सकता है, एक "विज़ुअल शासक" के रूप में सेवा करने के लिए जहां इंडेंटेशन शुरू होता है और समाप्त होता है। विभिन्न रंगों (जैसे प्रतिरोधों के लिए रंग कोड का पालन करना) भीड़ के लिए क्षतिपूर्ति कर सकते हैं।


1

इसकी अनुमति है क्योंकि लेखकों ने इसे अनुमति देने का निर्णय लिया है: https://docs.python.org/2/reference/simple_stmts.html

अगर यह सवाल उठता है कि लेखकों ने ऐसा क्यों किया, तो मुझे लगता है कि ऐसा इसलिए है क्योंकि अर्ध-स्तंभ को सरल कथन के रूप में कम से कम निम्नलिखित भाषाओं में अनुमति दी जाती है: C ++, C, C #, R, Matlab, Perl, ...

तो यह अन्य भाषा में पृष्ठभूमि वाले लोगों के लिए पायथन के उपयोग में तेजी से होता है। और इस तरह के विचलन में सामान्यता का कोई नुकसान नहीं है।


1

अर्धविराम (";") केवल एक ही ब्लॉक के भीतर बयानों को अलग करने के लिए आवश्यक है, जैसे कि हमारे पास निम्नलिखित सी कोड है:

if(a>b)
{
largest=a;  //here largest and count are integer variables
count+=1;
}

इसे पायथन में दो रूपों में लिखा जा सकता है:

if a>b:   
    largest=a
    count=count+1

या

if a>b:    largest=a;count=count+1

उपरोक्त उदाहरण में आप किसी ifब्लॉक के भीतर कितने भी बयान दे सकते हैं और ";" द्वारा अलग किया जा सकता है। बजाय।

आशा है कि उपरोक्त स्पष्टीकरण के रूप में कुछ भी सरल नहीं है।


0

यहां मौजूद विशाल ज्ञान को जोड़ते हुए ,
यह मैटलपोटलिब लाइब्रेरी से संबंधित एक उत्तर है

import numpy as np
import matplotlib as plt
%matplotlib notebook
linear_data = np.array([1, 2, 3, 4, 5, 6, 7, 8])
quadratic_data = linear_data**2
plt.figure()
xvals = range(len(linear_data))
plt.barh(xvals, linear_data, height = 0.3, color='b')
plt.barh(xvals, quadratic_data, height = 0.3, left=linear_data, color='r')

यदि आप बारह (क्षैतिज पट्टी) के अंत में अर्धविराम नहीं देते हैं, तो आउटपुट एक प्लॉट + एक फ़ंक्शन एड्रेस है। लेकिन यदि आप दोनों बारहवें लाइनों के अंत में अर्धविराम का उपयोग करते हैं, तो यह केवल प्लॉट दिखाता है और फ़ंक्शन एड्रेस के लिए आउटपुट को दबा देता है।

कुछ इस तरह से: तुलना


3
यह आईपीथॉन के लिए विशिष्ट है, और मानक पायथन आरईपीएल पर लागू नहीं होता है।
वज्र्ड्रिया

मुझे लगता है कि यह एक शानदार उदाहरण है जहां जिस तरह से भाषा लेखकों ने सोचा था कि वे सादगी, शक्ति और एकरूपता का परिचय दे रहे थे, वह इस तरह की समस्याओं के आगे सोचने में विफल रहा।
eSurfsnake
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.