2010-07-28 6 views
9

क्या मैं पाइथन में ऐसा कुछ कर सकता हूं?पायथन: लूप के लिए सी-जैसे कोई उपलब्ध है?

for (i = 0; i < 10; i++): 
    if someCondition: 
    i+=1 
    print i 

मैं एक शर्त के आधार पर कुछ मान को छोड़ने के लिए सक्षम होना चाहिए

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

for i in range(0,len(argv)): 
    arg = argv[i] 
    if arg == '--flag1': 
     opt1 = argv[i+1] 
     i+=1 
     continue 
    if arg == '--anotherFlag': 
     optX = argv[i+1] 
     optY = argv[i+2] 
     optZ = argv[i+3] 
     i+=3 
     continue 

    ... 
+2

आप वास्तव में क्या करने की कोशिश कर रहे हैं? – SilentGhost

+0

अधिक जानकारी के साथ अद्यतन प्रश्न ... –

+1

आपके लिए हमेशा 'while' है। – Constantin

उत्तर

6

से विभाज्य नहीं कर रहे हैं केवल मूल्यों वहाँ दो चीजें आप कर सकता है आपकी समस्या का समाधान करने के लिए कर रहे हैं:

  • को अल्पविराम से अलग तर्कों की आवश्यकता होती है जिन्हें निम्न विकल्प मान में समूहीकृत किया जा रहा है, तो आप getopt या किसी अन्य मॉड्यूल का उपयोग कर सकते हैं।
  • या अधिक नाजुक खुद प्रसंस्करण:

    sys.argv.pop() 
    cmd = {} 
    while sys.argv: 
        arg = sys.argv.pop(0) 
        if arg == '--arg1': 
         cmd[arg] = sys.argv.pop(0), sys.argv.pop(0) 
        elif: 
         pass 
    print(cmd) 
    
+0

एक स्टैक के रूप में argv का उपयोग करने का विचार मेरी आवश्यकताओं के लिए बहुत अच्छा है, और यह सूची में अनुक्रमित आधारित पहुंच को हटा देता है। –

17

हाँ, यह मैं कैसे करना होता है:

मैं मैन्युअल रूप से (यानी कोई getopt) कुछ cmd लाइन आर्ग है, जहां प्रत्येक 'कीवर्ड' इस तरह मानकों की एक निश्चित संख्या, कुछ न कुछ है पार्स करने के लिए चाहता हूँ यह

>>> for i in xrange(0, 10): 
...  if i == 4: 
...   continue 
...  print i, 
... 
0 1 2 3 5 6 7 8 9 

संपादित
अपने मूल प्रश्न के अद्यतन के आधार पर ... मैं तुम्हें optparse

0 पर एक नज़र डालें सुझाव है
+0

आपका मतलब हां :) –

+0

प्रिंटआउट होना चाहिए "0 1 2 3 5 6 7 8 9" – che

+0

@che: हाँ, पहले से ही तय किया गया है ... कभी-कभी सुबह में वसा उंगलियां मिलती हैं। 'Optparse' के लिए – sberry

2

सी और पायथन दोनों में, मूल्य को छोड़ने के लिए आपको continue का उपयोग करना चाहिए।

for i in range(10): 
    if someCondition: 
    continue 
    print(i) 
+0

एक ब्रेक मूल्य को छोड़ नहीं देगा हालांकि ... यह लूप के लिए टूट जाएगा। क्या आप 'जारी रखें' नहीं चाहते हैं? – sberry

+0

@ सब्बेरी: हाँ ... मैं क्या सोच रहा था: पी – kennytm

5

अजीब तरीका:

for x in (x for x in xrange(10) if someCondition): 
    print str(x) 
2

तुम शायद वास्तव में नहीं है सूचकांकों की जरूरत है, तो आप शायद वास्तविक आइटम की जरूरत है। एक बेहतर समाधान शायद इस तरह होगा:

sequence = 'whatever' 
for item in sequence: 
    if some_condition: 
     continue 
    do_stuff_with(item) 
+0

मैं दिन के किसी भी समय लूप के लिए एक इटरेटर का उपयोग करता हूं, हालांकि मैं अपनी स्थिति में पुनरावृत्ति का उपयोग करने का एक तरीका नहीं सोच सकता - अद्यतन प्रश्न देखें –

-1
for i in xrange(0, 10): 
    if i % 3 == 0 
     continue 
    print i 

विल जो 3.

-1

आप कुछ अधिक पुनरावृति करने के लिए, और एक सूचकांक की जरूरत की जरूरत है, enumerate()

for i, arg in enumerate(argv): 
    ... 

जो के रूप में ही करता है का उपयोग करें प्रश्नकर्ता का

for i in range(0,len(argv)): 
    arg = argv[i] 
-1

आपकी समस्या यह प्रतीत होती है कि आपको कच्चे पैरामीटर नहीं बल्कि पार्स पैरामीटर चाहिए। मैं आपको मानक मॉड्यूल (दूसरों की तरह) का उपयोग न करने के अपने निर्णय को बदलने पर विचार करने का सुझाव दूंगा।

1

आपको सबसे पहले एक जनरेटर में argv सूची बदल सकती है:

def g(my_list): 
    for item in my_list: 
     yield item 

फिर आप के रूप में आवश्यक वस्तुओं के माध्यम से कदम सकता है जनरेटर लागू:

my_gen = g(sys.argv[1:]): 
while True: 
    try: 
     arg = my_gen.next() 
     if arg == "--flag1": 
     optX = my_gen.next() 
     opyY = my_gen.next() 
     --do something 
     elif arg == "--flag2": 
     optX = my_gen.next() 
     optY = my_gen.next() 
     optZ = my_gen.next() 
     --do something else 
     ... 
    except StopIteration: 
     break 
+0

एक सूची में पुनरावृत्ति से अलग कैसे है? बस और अधिक परेशानी – SilentGhost

+0

विचार अच्छा है, लेकिन एक syerargv [1:] 'को एक जेनरेटर उदाहरण के बजाय जनरेटर उदाहरण में क्यों परिवर्तित करें? जैसे 'my_gen = iter (sys.argv [1:]) 'आपको आपके फ़ंक्शन' g' के समान परिणाम प्राप्त करेगा। –

+0

इसके अलावा, 'कोशिश' के साथ 'while' का उपयोग करने के बजाय: रोकथाम को छोड़कर: 'लूप के लिए एक ही चीज़ प्राप्त होगी। बस: 'my_gen' में तर्क के लिए। आप अभी भी लूप में 'my_gen.next()' का उपयोग कर सकते हैं। –

5
for (i = 0; i < 10; i++) 
    if someCondition: 
     i+=1 
print i 

अजगर में होगा

i = 0 
while i < 10 
    if someCondition 
     i += 1 
    print i 
    i += 1 

के रूप में लिखा गया आप फिर से जाते हैं, इस तरह पाइथन में लूप के लिए सी लिखना है।

+0

यदि 'somecondition' सत्य है, तो आप' i' को दो बार बढ़ाते हैं ... –

+3

@ क्रिस्टी हां लेकिन यह प्रश्न में मूल उदाहरण कोड में था, इसलिए मैंने सोचा कि वह वही था जो वह चाहता था। – Netzsooc