Python中是否有“do ... until”?

198 投票
4 回答
555764 浏览
提问于 2025-04-15 15:36

在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

Python中没有do-while循环。

下面是一个类似的结构,来自上面的链接。

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

撰写回答