是否有一个“问题”;做直至;用Python?

是否有一个“问题”;做直至;用Python?,python,loops,Python,Loops,有没有 do until x: ... 还是实现这种循环构造的好方法? 这是一个类似的构造,取自上面的链接 while True: do_something() if condition(): break 没有预先打包的“do while”,但是Python实现特殊循环构造的一般方法是通过生成器和其他迭代器,例如: import itertools def dowhile(predicate): it = itertools.repeat(

有没有

do until x:
    ...
还是实现这种循环构造的好方法?

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

 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

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

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

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

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

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

do while(虽然它应该被称为
until
)是我对Python最大的愿望。我想,搜索中没有出现这个副本,因为它的标题是“do while”@lennartreegebro:我也希望如此,直到(!)我读了在上找到的评论。我想指出,“do while”与“do until”不同。为什么
while 1
为True时有什么问题?为什么要强制将int转换为bool?@S.Lott,实际上,在Python 2.X中,True/False不是关键字,它们只是内置在全局常量中(与任何其他变量一样可以重新分配),因此解释器必须检查它们指向的内容。参见Python 2.7.3$Python-mtimeit'而0:pass'100000000循环,每个循环3:0.0132 usec的最佳值$Python-mtimeit'而False:pass'10000000循环,每个循环3:0.0538 usec的最佳值loop@jpmc26我只是支持
0
1
False
True
更快的说法。对于其他3%,了解
1
True
@jpmc26更快(可能是违反直觉的)会有所帮助。我曾在编程竞赛中使用Python来缩短开发时间。有时,在一个难以移植的解决方案中,一个紧密的数字循环是瓶颈,将'True'切换到
1
会将我的解决方案从“超出时间限制”切换到“更正”,速度会略微提高10%-20%。仅仅因为你不需要优化,它就没有它的用途。顺便说一句,这被称为“循环半”。Python继续支持这种构造,因为它是最容易正确编写和理解的循环模式之一。看@Brandon这和:
while有什么不同!条件do_something()
?@Bort循环半构造保证至少执行一次
do_something()
,即使
condition()
在循环开始时为true。如果
condition()
在开始时计算为true,那么你的
而不是condition():do\u something()
构造将永远不会执行
do\u something()
。@brandon是的,“简单、自然的方式”是循环半(TM)方式,特别是因为[one-fscking-]直到方式比其他方式更难掌握“带break的无限循环”…真正的pythonic,PEP排泄方式。PS:till不在Python中的唯一原因是因为他们没有找到合理的方法将其合并到强制缩进语法中(至少函数语言用尾部递归来补偿这一点)。我会倾向于@Bort的意图,如果你想保证第一次运行,那么在while循环之前
do_something()
。它不是干的,但我认为它最可读。
do_something(),而条件do_something()
。@Brandon发布的文章称这是一个
哨兵循环
。归根结底,这是一个风格上的选择,留给linters、代码库一致性和/或团队选择。每次我看到
为真时
我担心它永远不会结束,这就是为什么我喜欢看到用while行设置一个条件,即使它不是干的;我不喜欢想要寻找一个休息点或消化一个你可以使用的疯狂逻辑树。注意takewhile也会消耗序列/生成器中不满足谓词函数的第一个元素-这就是它知道如何停止获取的原因。但是如果你想迭代其余的元素,你会想“现在我会得到谓词为False的所有内容。”,您将错过其中的第一项。我也喜欢它,因为它比其他一些选项更具可读性
while 1:
 ...statements...
  if cond:
    break
finished = False
while not finished:
    ... do something...
    finished = evaluate_end_condition()