关于循环:Python中有“do … until”吗?

Is there a “do … until” in Python?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Emulate a do-while loop in Python?

有没有

1
2
do until x:
    ...

在Python中,还是实现这种循环结构的好方法?


在Python中没有do-while循环。

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

1
2
3
4
 while True:
     do_something()
     if condition():
        break


没有预先打包的"do while",但是实现特殊循环结构的一般python方法是通过生成器和其他迭代器,例如:

1
2
3
4
5
6
7
import itertools

def dowhile(predicate):
  it = itertools.repeat(None)
  for _ in it:
    yield
    if not predicate(): break

例如:

1
2
3
4
i=7; j=3
for _ in dowhile(lambda: i<j):
  print i, j
  i+=1; j-=1

根据需要执行一条腿,即使谓词在开头已经是假的。

通常,最好将更多的循环逻辑封装到生成器(或其他迭代器)中——例如,如果经常出现一个变量增加、一个变量减少,并且需要进行do/while循环比较的情况,则可以对其进行编码:

1
2
3
4
5
def incandec(i, j, delta=1):
  while True:
    yield i, j
    if j <= i: break
    i+=delta; j-=delta

你可以这样使用:

1
2
for i, j in incandec(i=7, j=3):
  print i, j

这取决于您想在生成器(或其他迭代器)中放入多少与循环相关的逻辑,以及您想在生成器之外拥有多少逻辑(就像您可以使用函数、类或其他机制从主执行流中重构代码一样),但一般来说,我喜欢看到EDO中使用的生成器cx1〔0〕循环几乎没有(理想情况下没有)"循环控制逻辑"(与更新下一个循环段的状态变量和/或测试是否应该再次循环相关的代码)。


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

1
2
3
4
finished = False
while not finished:
    ... do something...
    finished = evaluate_end_condition()

没有,而是使用一个while循环,例如:

1
2
3
4
while 1:
 ...statements...
  if cond:
    break