2009-10-16 12 views
6

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

if condition: 
    do_something() 
else: 
    do_something_else() 

यहाँ, do_something_else() केवल तभी condition गलत है, अपेक्षा के अनुरूप क्रियान्वित किया जाता है:

निम्नलिखित पर विचार करें।

इसी तरह,

try: 
    do_something() 
except someException: 
    pass: 
else: 
    do_something_else() 
finally: 
    cleanup() 

do_something_else() में ही अगर कोई अपवाद नहीं हुआ निष्पादित किया जाता है।

लेकिन लूप के लिए या किसी अन्य खंड में हमेशा एक निष्पादित किया जाता है, चाहे for/while block की सामग्री निष्पादित की गई हो या नहीं।

for i in some_iterator: 
    print(i) 
else: 
    print("Iterator is empty!") 

हमेशा प्रिंट होगा "इटरेटर खाली है!", कि क्या मैं some_iterator = [] या some_iterator = [1,2,3] का कहना है। while-else खंडों में वही व्यवहार। मुझे लगता है कि else इन मामलों में finally की तरह व्यवहार करता है। मैं क्या देख रहा हूँ

+0

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

+2

इसके लायक होने के लिए, पाइथन-विचार सूची पर/else, et al के लिए हाल ही में एक लंबी चर्चा हुई है, यहां संक्षेप में: http://article.gmane.org/gmane.comp.python.ideas/6131 /। Guido खुद इसके बारे में दूसरे विचार करने के लिए स्वीकार करते हैं: http://article.gmane.org/gmane.comp.python.ideas/6133/ –

+0

इन लिंक के लिए धन्यवाद! –

उत्तर

5

अच्छा, यह निर्भर करता है कि आप इसे कैसे देखते हैं। आप इस तरह elses देख सकते हैं (चिल्ला, कोड में जोर बनाने के लिए अपनी एक ही रास्ता बहाना):

if condition: 
    do_something() 
IF THE PREVIOUS CONDITION WAS FALSE: 
    do_something_else() 

अब, वहाँ/बाकी और कोशिश// किसी और, अगर सिवाय अगर बीच एक स्पष्ट समानता है आप अन्य बयान को छोड़कर बयान के रूप में देखते हैं। इस प्रकार सं.

try: 
    do_something() 
IF THERE WAS AN EXCEPTION: 
    pass: 
IF THE PREVIOUS CONDITION WAS FALSE: 
    do_something_else() 
finally: 
    cleanup() 

ही किसी और के लिए चला जाता है/के लिए:

IF some_iterator IS NOT EMPTY: 
    i = next(some_iterator) 
    print(i) 
IF THE PREVIOUS CONDITION WAS FALSE: 
    print("Iterator is empty!") 
तो यहाँ हम देखते हैं कि कुछ मौलिक तरीके में बाकी काम सभी तीन मामलों में बिल्कुल वैसा ही करना

लेकिन क्या आप भी इस तरह से किसी और देख सकते हैं:

try: 
    do_something() 
except someException: 
    pass: 
IF NO EXCEPTION: 
    do_something_else() 
finally: 
    cleanup() 

और फिर इसे अब और एक ही नहीं है, लेकिन किसी और क्योंकि "अगर और कुछ नहीं" का एक तरह।आप एक ही तरह से के लिए/किसी और देख सकते हैं: फिर

for i in some_iterator: 
    print(i) 
IF NO MORE ITERATING: 
    print("Iterator is empty!") 

लेकिन फिर भी, elif पर विचार है, तो यह देखने का इस तरह से काम करता है/किसी और रूप में अच्छी तरह के लिए:

if condition: 
    do_something() 
elif otherconditaion: 
    do_anotherthing() 
IF NO CONDITION WAS TRUE: 
    do_something_else() 

जो तुम जिस तरह से अन्यथा देखना चाहते हैं कि आप पर निर्भर है, लेकिन देखने के दोनों तरीकों में, अन्य सभी मामलों में समानताएं हैं।

+0

धन्यवाद। यह समझ में आता है और मेरे सवाल का जवाब देता है। –

13

for else निर्माण कार्यान्वित else खंड अगर कोई break बयान पाश के लिए मार डाला गया था, as described here उदाहरण के लिए, यह किसी खंड

for i in range(1,10): 
    if i % 5 == 0: 
     print i 
     break 
else: 
    print "nothing divisible by 5" 
+0

दाएं, इसलिए किसी के लिए/जबकि-अन्य कथन केवल तभी होता है जब कहीं ब्रेक स्टेटमेंट होता है। –

4

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

for i in range(1,10): 
    if i % 5 == 0: 
     print i 
     break 
if i % 5 != 0: 
    print "nothing divisible by 5" 

कौन सा यहाँ लगभग बराबर है, लेकिन काम करता है, तो छोड़ने के लिए शर्तों में थोड़ा और अधिक जटिल (विभिन्न संभव शर्तें या शर्तों के संयोजन की जाँच की तरह) है।