在Python中带条件的循环

12 投票
3 回答
40692 浏览
提问于 2025-04-16 07:52

考虑一下下面这段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 个回答

4

在Python中,带有固定上限的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)
10

这可能和你要问的没关系,但我想分享一下我常用的方法……如果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

不过,再说一次,这可能不适合你的情况,你应该根据自己的问题选择合适的筛选方法。

8

一般来说,使用"range + break"的方式更受欢迎。不过在Python 2.x版本中,迭代时应该用xrange而不是range,因为xrange是按需生成值,而不是一次性创建一个数字列表。

不过这也要看具体情况。这里的数字10有什么特别之处呢?some_condition到底是什么呢?等等。

更新的回复:

听起来some_condition是一个“循环不变式”,也就是说在循环过程中它不会改变。在这种情况下,我们应该先测试一下它:

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

撰写回答