巨蟒里有“直到”这个词吗?

有没有

do until x:
...

还是实现这种循环结构的好方法?

500000 次浏览

Python 中没有 do-while 循环。

这是一个类似的结构,取自上面的链接。

 while True:
do_something()
if condition():
break

没有预先打包的“ 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

根据需要执行一个分支,即使谓词在开始时已经为 false。

通常最好将更多的循环逻辑封装到您的生成器(或其他迭代器)中——例如,如果您经常遇到一个变量增加,一个变量减少的情况,并且您需要一个 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循环中使用的生成器,它几乎没有(理想情况下没有)“循环控制逻辑”(与更新下一个循环部分的状态变量相关的代码,或者测试你是否应该再次循环)。

不,没有。相反,使用 while循环,如:

while 1:
...statements...
if cond:
break

我更喜欢使用循环变量,因为它读起来比“ while 1:”好一点,而且没有难看的 break语句:

finished = False
while not finished:
... do something...
finished = evaluate_end_condition()