在Python中带条件的循环
考虑一下下面这段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()
重要说明
some_condition
并不是在循环中计算的,而是用来决定是否一开始就要进入循环我指的是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()