2010-12-01 31 views
9

सी में निम्नलिखित कोड पर विचार करें:लूप

for(int i=0; i<10 && some_condition; ++i){ 
    do_something(); 
} 

मैं अजगर में कुछ इसी तरह लिखने के लिए करना चाहते हैं। सबसे अच्छा संस्करण मैं के बारे में सोच सकता है:

i = 0 
while some_condition and i<10: 
    do_something() 
    i+=1 

सच कहूं, मैं while छोरों कि for छोरों की नकल पसंद नहीं है। यह काउंटर वैरिएबल बढ़ाने के लिए भूलने के जोखिम के कारण है। एक अन्य विकल्प है कि इस जोखिम addressess है:

for i in range(10): 
    if not some_condition: break 
    do_something() 

महत्वपूर्ण स्पष्टीकरण

  1. some_condition पाश दौरान गणना की जा करने के लिए नहीं है, बल्कि पहले में पाश शुरू करने के लिए तय करने के लिए जगह

  2. मैं python2.6

    को
जिक्र कर रहा हूँ

कौन सी शैली को प्राथमिकता दी जाती है? क्या ऐसा करने के लिए कोई बेहतर मुहावरे है?

+0

मुझे लगता है कि यह व्यक्तिगत वरीयता का मामला है। – NPE

+0

पायथन का कौन सा संस्करण? – khachik

+1

मुझे लगता है कि पाइथन को ' बार' जैसे निर्माण होना चाहिए: ', आपको यह स्पष्ट करने की अनुमति देने के लिए कि आप वास्तव में लूप काउंटर का उपयोग नहीं करेंगे। –

उत्तर

7

सामान्य में, "range + break" शैली पसंद किया जाता है - लेकिन अजगर 2.x में, xrange बजाय range का उपयोग यात्रा के लिए (इस पर मांग के बजाय वास्तव में नंबरों की सूची बनाने के मूल्यों बनाता है)।

लेकिन यह हमेशा निर्भर करता है। इस संदर्भ में संख्या 10 के बारे में क्या खास है? some_condition क्या है? आदि

रिस्पांस अद्यतन करने के लिए:

ऐसा लगता है जैसे कि some_condition एक "पाश अपरिवर्तनीय" है, यानि कि पाश के दौरान नहीं बदलेगा। उस मामले में, हम सिर्फ यह पहली बार परीक्षण करना चाहिए: एक निरंतर ऊपरी सीमा के साथ

if some_condition: 
    for i in xrange(10): 
    do_something() 
+0

10 और रेंज केवल उदाहरण हैं जो 'my_array' में' हो सकते थे। जैसा कि प्रश्न में स्पष्ट किया गया है, 'some_condition' नियंत्रित करता है कि प्रोग्राम को लूप करने या इसे –

+0

पर छोड़ने की आवश्यकता है या नहीं, आपका संस्करण सरल और काम करता है। मैं बस अतिरिक्त इंडेंटेशन छोड़ना चाहता था। धन्यवाद –

3

for छोरों थोड़ा अजगर में दुर्लभ हैं। आप somearray से अधिक पुनरावृत्ति रहे हैं, तो आप क्या कर सकते हैं:

for i in xrange(len(somearray)): 
    if not some_condition: 
     break 
    do_sth_with(i, somearray[i]) 

या, बेहतर:

for i, item in enumerate(somearray): 
    if not some_condition: 
     break 
    do_sth_with(i, item) 
8

यह संबंधित नहीं किया जा सकता है, लेकिन अगर कोई some_condition है मुझे क्या करना ... इस्तेमाल किया कर रहा हूँ

def some_condition(element): 
    return True#False 

for i in filter(some_condition, xrange(10)): 
    pass 

जब आप तत्वों में से कुछ सूची पर पुनरावृति भी इस दृष्टिकोण का उपयोग कर सकते हैं: काफी सरल है, यह एक समारोह और filter आइटम तुम पर पुनरावृति में डाल दिया।

selected = filter(some_condition, to_process) 
for i, item in enumerate(selected): 
    pass 

फिर, यह आपके मामले के नहीं हो सकता है, आप अपनी समस्या के आधार पर छानने मदों की विधि का चयन करना चाहिए।

+1

या, इसे कम और कम पठनीय बनाने के लिए: 'मैं फिल्टर में (लैम्ब्डा एक्स: ट्रू, रेंज (10)): do_something() ' –