2010-07-28 27 views
9

Tôi có thể làm điều gì đó như thế này bằng Python không?Python: có sẵn kiểu C cho vòng lặp không?

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

tôi cần để có thể bỏ qua một số giá trị dựa trên một điều kiện

EDIT: Tất cả các giải pháp cho đến nay đề nghị cắt tỉa phạm vi ban đầu bằng cách này hay cách khác, dựa trên một điều kiện đã được biết đến. Điều này không hữu ích cho tôi, vì vậy hãy để tôi giải thích những gì tôi muốn làm.

Tôi muốn tự (tức là không có getopt) phân tích một số args dòng cmd, trong đó mỗi 'từ khóa' có một số lượng nhất định các thông số, một cái gì đó như thế này:

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

bạn đang thực sự cố gắng làm gì? – SilentGhost

+0

câu hỏi được cập nhật với nhiều thông tin hơn ... –

+1

Luôn có 'while' cho bạn. – Constantin

Trả lời

6

Có hai điều bạn có thể làm để giải quyết vấn đề của bạn:

  • yêu cầu các đối số được phân cách bằng dấu phẩy sẽ được nhóm thành giá trị tùy chọn sau, bạn có thể sử dụng getopt hoặc bất kỳ mô-đun nào khác sau đó.
  • hoặc làm mỏng manh hơn chế biến riêng:

    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

Ý tưởng sử dụng argv như một ngăn xếp là rất tốt cho nhu cầu của tôi, và nó loại bỏ các truy cập dựa trên chỉ mục vào danh sách. –

17

Có, đây là cách tôi sẽ làm nó

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

EDIT
Dựa trên bản cập nhật cho câu hỏi ban đầu của bạn ... tôi sẽ đề nghị bạn hãy xem optparse

+0

Ý bạn là có :) –

+0

Bản in nên là "0 1 2 3 5 6 7 8 9" – che

+0

@che: Yeah, đã cố định rằng ... có ngón tay béo vào buổi sáng đôi khi. – sberry

2

Bạn nên sử dụng continue để bỏ qua một giá trị, trong cả C và Python.

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

Việc ngắt sẽ không bỏ qua giá trị mặc dù ... nó sẽ thoát ra khỏi vòng lặp for. Bạn sẽ không muốn 'tiếp tục'? – sberry

+0

@ sberry: Vâng ... Tôi đang nghĩ gì: p – kennytm

5

cách Strange:

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

Bạn có thể không thực sự cần các chỉ số, bạn có thể cần các mặt hàng thực tế. Một giải pháp tốt hơn có lẽ sẽ là như thế này:

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

Tôi sẽ sử dụng một trình vòng lặp trên một vòng lặp cho bất kỳ thời điểm nào trong ngày, tuy nhiên tôi không thể nghĩ ra một cách để sử dụng lặp lại trong tình huống của tôi - xem câu hỏi được cập nhật –

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

Sẽ chỉ có giá trị mà không chia hết cho 3.

-1

Nếu bạn cần để lặp qua một cái gì đó, cần một chỉ số, sử dụng enumerate()

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

mà không giống nhau như người hỏi

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

Vấn đề của bạn dường như là bạn không nên lặp lại các tham số thô nhưng tham số được phân tích cú pháp. Tôi sẽ khuyên bạn nên xem xét để thay đổi quyết định của bạn không sử dụng mô-đun chuẩn (như những người khác).

1

Trước tiên, bạn có thể biến danh sách argv vào một máy phát điện:

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

Sau đó bạn có thể bước qua các mục, gọi máy phát điện theo yêu cầu:

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

làm thế nào mà bất kỳ khác nhau hơn iterating trên một danh sách? rắc rối hơn. – SilentGhost

+0

Ý tưởng là tốt, nhưng tại sao chuyển đổi 'sys.argv [1:]' thành một cá thể máy phát chứ không phải là một trình lặp? Ví dụ. 'my_gen = iter (sys.argv [1:])' sẽ cho bạn kết quả tương tự như hàm 'g' của bạn. –

+0

Ngoài ra, thay vì sử dụng 'while' với' try: except StopIteration: 'a for loop sẽ đạt được điều tương tự. Đơn giản: 'for arg in my_gen'. Bạn vẫn có thể sử dụng 'my_gen.next()' trong vòng lặp. –

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

Trong python sẽ được viết dưới dạng

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

lại bạn đi, đó là làm thế nào để viết một c cho vòng lặp trong python.

+0

Nếu 'somecondition' là đúng, bạn tăng' i' hai lần ... –

+3

@Cristi yes nhưng đó là trong mã ví dụ ban đầu trong câu hỏi, vì vậy tôi nghĩ đó là những gì anh ta muốn. – Netzsooc

Các vấn đề liên quan