मैंने देखा है कि पायथन में निम्न कोड कानूनी है। मेरा सवाल यह है कि क्यों? क्या कोई खास वजह है?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
after:
।
मैंने देखा है कि पायथन में निम्न कोड कानूनी है। मेरा सवाल यह है कि क्यों? क्या कोई खास वजह है?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
after:
।
जवाबों:
else
खंड केवल मार डाला है जब आपके है while
हालत झूठी हो जाता है। यदि आप break
लूप से बाहर हैं, या यदि कोई अपवाद उठाया गया है, तो इसे निष्पादित नहीं किया जाएगा।
इसके बारे में सोचने का एक तरीका यह है कि क्या शर्त के संबंध में एक और तरीका है:
if condition:
handle_true()
else:
handle_false()
लूपिंग निर्माण के अनुरूप है:
while condition:
handle_true()
else:
# condition is false now, handle and go on with the rest of the program
handle_false()
एक उदाहरण की तर्ज पर हो सकता है:
while value < threshold:
if not process_acceptable_value(value):
# something went wrong, exit the loop; don't pass go, don't collect 200
break
value = update(value)
else:
# value >= threshold; pass go, collect 200
handle_threshold_reached()
while {} something
सिवाय इसके कि something
अगर आप पाश break
में हैं तो छोड़ दिया जाएगा while
।
else
यदि आप एक ब्लॉक सामान्य रूप से बाहर निकलते हैं, पाश हालत मार या एक कोशिश ब्लॉक के नीचे से गिरकर खंड निष्पादित किया जाता है। इसे निष्पादित नहीं किया जाता है यदि आप किसी ब्लॉक से break
या return
बाहर निकलते हैं, या एक अपवाद बढ़ाते हैं। यह न केवल जबकि छोरों के लिए काम करता है, बल्कि ब्लॉक का भी प्रयास करता है।
आप इसे आमतौर पर उन जगहों पर पाते हैं, जहां आमतौर पर आप एक लूप से जल्दी बाहर निकल जाते हैं, और लूप के अंत से बाहर चलना एक अप्रत्याशित / असामान्य अवसर होता है। उदाहरण के लिए, यदि आप किसी मूल्य की तलाश करने वाली सूची से गुजर रहे हैं:
for value in values:
if value == 5:
print "Found it!"
break
else:
print "Nowhere to be found. :-("
found_it=False
एक लूप की शुरुआत में डाल दिया है , और फिर एक अगर found_it
अंत में जाँच करें
इसके जवाब में Is there a specific reason?
, यहां एक दिलचस्प अनुप्रयोग है: लूपिंग के कई स्तरों को तोड़ना।
यहां बताया गया है कि यह कैसे काम करता है: बाहरी लूप के अंत में एक ब्रेक होता है, इसलिए इसे केवल एक बार निष्पादित किया जाएगा। हालांकि, अगर आंतरिक लूप पूरा हो जाता है (कोई विभाजक नहीं मिलता है), तो यह दूसरे विवरण तक पहुंच जाता है और बाहरी ब्रेक कभी नहीं पहुंचता है। इस तरह, आंतरिक लूप का ब्रेक केवल एक के बजाय दोनों छोरों से बाहर निकल जाएगा।
for k in [2, 3, 5, 7, 11, 13, 17, 25]:
for m in range(2, 10):
if k == m:
continue
print 'trying %s %% %s' % (k, m)
if k % m == 0:
print 'found a divisor: %d %% %d; breaking out of loop' % (k, m)
break
else:
continue
print 'breaking another level of loop'
break
else:
print 'no divisor could be found!'
दोनों while
और for
छोरों के लिए, else
बयान को अंत में निष्पादित break
किया जाता है , जब तक कि इसका उपयोग नहीं किया गया था।
ज्यादातर मामलों में ऐसा करने के लिए बेहतर तरीके हैं (इसे किसी फ़ंक्शन में लपेटना या अपवाद उठाना), लेकिन यह काम करता है!
जब स्थिति असत्य का मूल्यांकन करती है तो अन्य-खंड को निष्पादित किया जाता है।
से प्रलेखन :
जब तक कथन एक अभिव्यक्ति के सत्य होने तक दोहराया निष्पादन के लिए उपयोग किया जाता है:
while_stmt ::= "while" expression ":" suite ["else" ":" suite]
यह बार-बार अभिव्यक्ति का परीक्षण करता है और, अगर यह सच है, तो पहले सूट को निष्पादित करता है; यदि अभिव्यक्ति झूठी है (जो पहली बार परीक्षण किया जा सकता है)
else
, तो क्लॉज का सूट , यदि मौजूद है, तो निष्पादित किया जाता है और लूप समाप्त हो जाता है।
break
पहले सूट में निष्पादित एक बयानelse
क्लॉज के सूट को निष्पादित किए बिना लूप को समाप्त करता है ।continue
पहले सूट में निष्पादित एक स्टेटमेंट, बाकी सुइट को छोड़ देता है और एक्सप्रेशन की जांच करने के लिए वापस चला जाता है।
मेरा उत्तर उस पर ध्यान केंद्रित करेगा जब हम / के लिए उपयोग कर सकते हैं-अन्यथा।
पहली नज़र में, ऐसा लगता है कि उपयोग करते समय कोई अलग नहीं है
while CONDITION:
EXPRESSIONS
print 'ELSE'
print 'The next statement'
तथा
while CONDITION:
EXPRESSIONS
else:
print 'ELSE'
print 'The next statement'
क्योंकि print 'ELSE'
कथन हमेशा दोनों मामलों में निष्पादित होता है (दोनों जब while
लूप समाप्त होता है या नहीं चलता है)।
फिर, यह केवल भिन्न है जब कथन print 'ELSE'
निष्पादित नहीं किया जाएगा। यह तब होता है जब break
कोड ब्लॉक के अंदर होता हैwhile
In [17]: i = 0
In [18]: while i < 5:
print i
if i == 2:
break
i = i +1
else:
print 'ELSE'
print 'The next statement'
....:
0
1
2
The next statement
यदि भिन्न है:
In [19]: i = 0
In [20]: while i < 5:
print i
if i == 2:
break
i = i +1
print 'ELSE'
print 'The next statement'
....:
0
1
2
ELSE
The next statement
return
इस श्रेणी में नहीं है, क्योंकि यह ऊपर के दो मामलों के लिए एक ही प्रभाव करता है।
अपवाद बढ़ाने से भी कोई फर्क नहीं पड़ता है, क्योंकि जब यह उठता है, जहां अगला कोड निष्पादित किया जाएगा अपवाद हैंडलर (ब्लॉक को छोड़कर) में है, तो else
क्लॉज या क्लॉज के ठीक बाद के कोड को while
निष्पादित नहीं किया जाएगा।
मुझे पता है यह पुराना सवाल है लेकिन ...
जैसा कि रेमंड हेटिंगर ने कहा, इसे while/no_break
इसके बजाय कहा जाना चाहिए while/else
।
मुझे यह समझने में आसानी होती है कि क्या आप इस स्निपेट को देखते हैं।
n = 5
while n > 0:
print n
n -= 1
if n == 2:
break
if n == 0:
print n
लूप के बाद की स्थिति की जाँच के बजाय अब हम इसे स्वैप कर सकते हैं else
और उस चेक से छुटकारा पा सकते हैं।
n = 5
while n > 0:
print n
n -= 1
if n == 2:
break
else: # read it as "no_break"
print n
मैं हमेशा while/no_break
कोड को समझने के लिए इसे पढ़ता हूं और यह वाक्य रचना मेरे लिए बहुत मायने रखती है।
दूसरे खंड को केवल तभी निष्पादित किया जाता है जब स्थिति असत्य हो जाती है।
यहाँ कुछ उदाहरण हैं:
उदाहरण 1: प्रारंभ में स्थिति झूठी है, इसलिए अन्य-खंड को निष्पादित किया जाता है।
i = 99999999
while i < 5:
print(i)
i += 1
else:
print('this')
उत्पादन:
this
उदाहरण 2: जबकि शर्त i < 5
कभी नहीं झूठी क्योंकि बन i == 3
टूटता पाश है, तो बाकी-खंड निष्पादित नहीं किया गया था।
i = 0
while i < 5:
print(i)
if i == 3:
break
i += 1
else:
print('this')
उत्पादन:
0
1
2
3
उदाहरण 3: जबकि शर्त i < 5
झूठी जब बन गया i
था 5
, इसलिए बाकी-खंड मार डाला गया था।
i = 0
while i < 5:
print(i)
i += 1
else:
print('this')
उत्पादन:
0
1
2
3
4
this
इस else:
कथन को तब ही क्रियान्वित किया जाता है जब और जब लूप अब अपनी स्थिति से मिलता है (आपके उदाहरण में, जब n != 0
गलत है)।
तो आउटपुट यह होगा:
5
4
3
2
1
what the...
यदि लूप नहीं टूटता है तो एल्स निष्पादित होता है।
मैं इसे 'रनर' रूपक के साथ सोचना पसंद करता हूं।
"और" फिनिश लाइन को पार करने जैसा है, चाहे आप ट्रैक की शुरुआत या अंत में शुरू किया हो। "अन्य" को केवल तभी निष्पादित नहीं किया जाता है यदि आप बीच में कहीं टूट जाते हैं।
runner_at = 0 # or 10 makes no difference, if unlucky_sector is not 0-10
unlucky_sector = 6
while runner_at < 10:
print("Runner at: ", runner_at)
if runner_at == unlucky_sector:
print("Runner fell and broke his foot. Will not reach finish.")
break
runner_at += 1
else:
print("Runner has finished the race!") # Not executed if runner broke his foot.
मुख्य उपयोग के मामले इस नेस्टेड लूप से बाहर का उपयोग कर रहे हैं या यदि आप कुछ बयान केवल तभी चलाना चाहते हैं यदि लूप कहीं नहीं टूटे (एक असामान्य स्थिति होने के बारे में सोचें)।
उदाहरण के लिए, चर का उपयोग किए बिना एक आंतरिक लूप से बाहर निकलने के तरीके या कोशिश / पकड़ने के लिए निम्नलिखित तंत्र है:
for i in [1,2,3]:
for j in ['a', 'unlucky', 'c']:
print(i, j)
if j == 'unlucky':
break
else:
continue # Only executed if inner loop didn't break.
break # This is only reached if inner loop 'breaked' out since continue didn't run.
print("Finished")
# 1 a
# 1 b
# Finished
Better जबकि: और: ’का बेहतर उपयोग पायथन में होना चाहिए यदि कोई लूप 'जबकि’ में निष्पादित नहीं होता है, तो execut और ’स्टेटमेंट निष्पादित होता है। जिस तरह से यह आज काम करता है इसका कोई मतलब नहीं है क्योंकि आप नीचे दिए गए कोड का उपयोग एक ही परिणाम के साथ कर सकते हैं ...
n = 5
while n != 0:
print n
n -= 1
print "what the..."
else
यदि आप लूप का उपयोग कर रहे हैं break
या return
कीवर्ड छोड़ रहे हैं तो ब्लॉक निष्पादित नहीं किया जाएगा । आपके उदाहरण में, print
निष्पादित किया जाएगा भी अगर लूप break
कमांड पर समाप्त हो गया है ।
यह सामाजिक संपर्क के लिए उपयोगी है।
while (Date != "January 1st"):
time.sleep(1)
else:
print("Happy new year!")
else
यहाँ का उद्देश्य क्या है ? कोड इसके बिना बिल्कुल वैसा ही करता है।
break
उलटी गिनती के दौरान आपकी घड़ी और कैलेंडर , तो उपयोग न करने else
से आप कहेंगे "नया साल मुबारक हो!" तुरन्त जो कोई मतलब नहीं है।
break
" से आपका क्या तात्पर्य है ? break
कोड में कोई भी नहीं है।
else
इस उपयोग के लिए शब्द का चुनाव एक उल्लेखनीय रूप से बुरा विचार था, और यह कि वे इनमें से कुछ भी नहीं करेंगे।