2012-12-21 31 views
5
def funcA(i): 
    if i%3==0: 
     print "Oh! No!", 
     print i 
     break 

for i in range(100): 
    funcA(i) 
    print "Pass", 
    print i 

मुझे पता है कि उपरोक्त स्क्रिप्ट काम नहीं करेगी। तो, अगर मुझे ब्रेक के साथ फ़ंक्शन डालने या लूप में जारी रखने की आवश्यकता है तो मैं कैसे लिख सकता हूं?ब्रेक और फ़ंक्शन में जारी रखें

उत्तर

11

कोई फ़ंक्शन उस कोड में ब्रेक या जारी नहीं रख सकता है, जिससे इसे कॉल किया जाता है। ब्रेक/जारी रखना सचमुच लूप के अंदर दिखाना है। आपके विकल्प हैं:

  1. वापसी funcA से एक मूल्य और इसका इस्तेमाल करते हैं कि क्या तोड़ने के लिए
  2. funcA में एक अपवाद उठाते हैं और बुला कोड में इसे पकड़ (या कहीं अधिक अप कॉल श्रृंखला)
  3. तय करने के लिए एक जनरेटर है कि ब्रेक तर्क समाहित लिख सकते हैं और अधिक पुनरावृति कि बजाय अधिक range

तक # 3 मैं कुछ इस तरह मतलब है:

def gen(base): 
    for item in base: 
     if item%3 == 0: 
      break 
     yield i 

for i in gen(range(1, 100)): 
    print "Pass," i 

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

+1

एक जनरेटर जो ब्रेक तर्क को समाहित करता है? – ThunderEX

+0

@ थंडरएक्स - कुछ 'itertools.takewhile' जैसे – eumiro

+0

@ थंडरएक्स: हाँ, कुछ समय के समान। मेरा संपादित उत्तर देखें। – BrenBarn

2
def funcA(i): 
    if i%3==0: 
     print "Oh! No!", 
     print i 
     return True 
    else: 
     return False 

for i in range(100): 
    if funcA(i): 
     break 
    print "Pass", 
    print i 
+0

ने उल्लेख किया है आप कैसे इस कोड को सवाल का जवाब की एक विवरण जोड़ने सकते हैं? –

1

ब्रेक फ़ंक्शंस के बीच प्रचार नहीं करेगा, आपको इसे सीधे लूप के अंदर रखना होगा।

2

ब्रेनबर्न का विस्तार उत्तर: breakसौभाग्य से प्रसारित नहीं होगा। break वर्तमान पाश, अवधि को तोड़ना है। यदि आप किसी ईवेंट को प्रचारित करना चाहते हैं, तो आपको raise अपवाद होना चाहिए। हालांकि, लूप को तोड़ने के लिए अपवाद उठाना लूप तोड़ने और आपके कोड को तोड़ने का एक अच्छा तरीका है।

KISS! सबसे सरल पाश में सीधे हालत की जांच करने के

def my_condition(x): 
    return x == 4 

for i in xrange(100): 
    if my_condition(i): break 
    print i 

, तो किसी कारण से, आप एक अपवाद प्रचार करने के लिए चाहते हैं, तो आप इसे इस

# exception example 
for i in xrange(100): 
    if i == 4: raise Exception("Die!") 
    print i 

तरह का उपयोग किया जाएगा के रूप में उल्लेख किया है, यह है वास्तव में बदसूरत डिज़ाइन। कल्पना कीजिए कि आप इस अपवाद को पकड़ने के लिए भूल जाते हैं, या आप MyBreakException को Exception से अपने प्रकार बदल सकते हैं और कोड की try/except उच्च भाग में कहीं न कहीं इसे बदलने के लिए भूल जाते हैं ...

जनरेटर उदाहरण तो इसके लाभों पर है, यह अपने कोड अधिक functional style बनाता है (जो मैं presonally पसंद है)

# generator example 
def conditional_generator(n, condition): 
    for i in xrange(n): 
    if condition(i): 
     break 
    else: 
     yield i 


for i in conditional_generator(100, my_condition): 
    print i 

... जो takewhile के समान है, eumiro