2010-07-28 115 views
9

我可以在Python中做这样的事吗?Python:有没有类似C的for循环可用?

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

我需要能够根据条件跳过一些值

编辑:所有的解决方案至今建议修剪以这种或那种方式的初始范围内,基于一个已知条件。这对我没有用,所以让我解释我想要做什么。

我想手动(即没有getopt的)解析某些CMD行参数,其中每个“关键字”有一定数量的参数,像这样:

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 2010-07-28 15:16:32

+0

更新的问题与更多的信息.​​.. – 2010-07-28 15:39:49

+1

总是有'while'给你。 – Constantin 2010-07-28 20:36:00

回答

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作为堆栈使用的想法非常适合我的需求,并且它将删除基于索引的对列表的访问。 – 2010-08-06 14:37:59

17

是的,这是我会怎么做它

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

编辑
基于更新到你原来的问题......我建议你看一看optparse

+0

你的意思是说:) – 2010-07-28 15:19:16

+0

打印输出应该是“0 1 2 3 5 6 7 8 9” – che 2010-07-28 15:23:05

+0

@che:是的,已经修好了......有时候在早上有时会发胖。 – sberry 2010-07-28 15:25:33

2

您应该使用continue跳过C和Python中的值。

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

中断不会跳过该值,但它会跳出for循环。你不想要“继续”吗? – sberry 2010-07-28 15:19:44

+0

@sberry:是的......我在想什么:p – kennytm 2010-07-28 15:21:49

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

在一天中的任何时候,我都会使用迭代器遍历for循环,但是我无法想象在我的情况下使用迭代的方式 - 查看更新的问题 – 2010-07-28 15:41:20

-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 2010-07-28 18:03:10

+0

这个想法很好,但为什么要将'sys.argv [1:]'转换为生成器实例而不是迭代器?例如。 'my_gen = iter(sys.argv [1:])'会得到与你的函数'g'相同的结果。 – 2010-07-28 19:01:11

+0

另外,不要使用'while'和'try:除了StopIteration:'for循环将实现同样的事情。简单地说:“对于my_gen中的arg”。你仍然可以在循环中使用'my_gen.next()'。 – 2010-07-28 19:08:14

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 

你去吧,那就是如何在python中编写一个c for循环。

+0

如果'somecondition'是真的,你增加'i'两次...... – 2013-02-05 09:15:25

+3

@Cristi是的,但是这是在原来的问题代码示例中,所以我认为这是他想要的。 – Netzsooc 2013-02-06 01:01:30