Python中带条件的循环

11

考虑以下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

坦白地说,我不喜欢模仿 for 循环的 while 循环。这是因为有遗忘增加计数变量的风险。另一个能解决这个问题的选择是:

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

重要澄清:

  1. some_condition 的计算不应该在循环期间进行,而是用来指定是否开始循环。

  2. 我所指的是Python2.6版本。

哪种风格更好?是否有更好的惯用语来实现这个?


我认为这是个人喜好的问题。 - NPE
Python的哪个版本? - khachik
1
我认为Python应该有一个像“do <expr> times:”这样的结构,以允许您明确表示您实际上不会使用循环计数器。 - Karl Knechtel
Karl: for _ in range(10) 似乎是一种常见的表示方式,但如果你恰好在使用 gettext 的话,这当然是一个可怕的想法。 - Wooble
3个回答

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

这种情况可能不适用于您,您应根据问题选择过滤项的方法。


1
或者,让它更短,更不可读:for i in filter(lambda x: True, range(10)): do_something() - Boris Gorelik

8
一般情况下,优先使用“range + break”的方式-但在Python 2.x中,迭代时请使用xrange而不是range(这样可以按需生成值,而不是实际上生成数字列表)。
但这取决于具体情况。这个上下文中数字10有什么特殊之处?some_condition到底是什么?等等。
更新的响应:
听起来some_condition是一个“循环不变量”,即在循环期间不会改变。在这种情况下,我们应该首先测试它:
if some_condition:
  for i in xrange(10):
    do_something()

10和range只是示例,实际上可以用for i in my_array。正如问题所澄清的那样,some_condition控制程序是否需要执行循环或跳过它。 - Boris Gorelik
你的版本很简单明了,而且能够正常工作。我只是想避免额外的缩进。谢谢。 - Boris Gorelik

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接