循环条件在python中

时间:2010-12-01 11:40:35

标签: coding-style python idioms idiomatic

请考虑C中的以下代码:

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

我想在Python中编写类似的东西。我能想到的最好的版本是:

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

坦率地说,我不喜欢模仿while循环的for循环。这是由于忘记增加计数器变量的风险。另一个选择是增加这种风险:

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

重要说明

  1. some_condition不是要在循环中计算,而是指定是否首先启动循环

  2. 我指的是Python2.6

  3. 首选哪种款式?有没有更好的成语呢?

3 个答案:

答案 0 :(得分:9)

这可能没有关系,但我已经习惯了......如果some_condition足够简单,可以将它放在一个函数中,并迭代filter项:

def some_condition(element):
    return True#False

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

当您迭代某些元素列表时,也可以使用此方法。

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

同样,这可能不是你的情况,你应该根据你的问题选择过滤项目的方法。

答案 1 :(得分:7)

通常,首选“range + break”样式 - 但在Python 2.x中,使用xrange代替range进行迭代(这会创建按需按值而不是实际制作数字列表。

但它总是取决于。在这种情况下,10号的特殊之处是什么?究竟是什么some_condition?等

对更新的回应:

听起来好像some_condition是“循环不变”,即在循环期间不会改变。在这种情况下,我们应该先测试一下:

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

答案 2 :(得分:3)

具有常量上限的

for循环在Python中有点罕见。如果您正在迭代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)