Python中是否有“do ... until”?
在Python中,有没有类似这样的
do until x:
...
循环结构,或者有没有什么好的方法来实现这样的循环?
4 个回答
29
虽然Python没有现成的“do-while”循环,但一般来说,Python实现这种特殊循环的方式是通过生成器和其他迭代器,比如:
import itertools
def dowhile(predicate):
it = itertools.repeat(None)
for _ in it:
yield
if not predicate(): break
举个例子:
i=7; j=3
for _ in dowhile(lambda: i<j):
print i, j
i+=1; j-=1
即使在开始时条件已经不成立,它仍然会执行一次循环,这是我们想要的效果。
通常,把更多的循环逻辑放进生成器(或其他迭代器)里会更好。例如,如果你经常遇到一个变量增加、另一个变量减少的情况,并且需要一个do/while循环来比较它们,你可以这样写:
def incandec(i, j, delta=1):
while True:
yield i, j
if j <= i: break
i+=delta; j-=delta
然后你可以像这样使用:
for i, j in incandec(i=7, j=3):
print i, j
你可以决定把多少循环相关的逻辑放在生成器(或其他迭代器)里,多少放在外面(就像使用函数、类或其他机制来重构代码一样),但一般来说,我喜欢在for
循环中使用生成器,并且希望这个循环里几乎没有(理想情况下是没有)“循环控制逻辑”(就是更新状态变量和判断是否继续循环的代码)。
52
我更喜欢使用一个循环变量,因为这样看起来比单纯写“while 1:”要好一些,而且也不用写那些看起来很难看的break
语句。
finished = False
while not finished:
... do something...
finished = evaluate_end_condition()
326