Python中有“做......直到”吗? [复制]
Posted
技术标签:
【中文标题】Python中有“做......直到”吗? [复制]【英文标题】:Is there a "do ... until" in Python? [duplicate] 【发布时间】:2010-12-12 08:10:29 【问题描述】:有没有
do until x:
...
在 Python 中,还是实现这种循环结构的好方法?
【问题讨论】:
一个do-while(虽然应该叫until
)是我对Python最大的愿望。
重复没有出现在搜索中,我想是因为它的标题是“do-while”
@LennartRegebro:我也希望如此,直到(!)我阅读了mail.python.org/pipermail/python-dev/2006-February/060718.html 上的评论。
我想指出,“do while”不同于“do until”。
【参考方案1】:
There is no do-while loop in Python.
这是一个类似的结构,取自上面的链接。
while True:
do_something()
if condition():
break
【讨论】:
顺便说一句,这被称为“循环半”。 Python 继续支持这种结构,因为它是最容易正确编写和理解的循环模式之一。见cs.duke.edu/~ola/patterns/plopd/loops.html#loop-and-a-half @Brandon 这与:while !condition do_something()
有什么不同吗?
@Bort 循环半结构保证do_something()
将至少执行一次,即使condition()
在循环开始时为真。如果 condition()
在开始时计算为 true,您的 while not condition(): do_something()
构造将永远不会执行 do_something()
。
@brandon 是的,“简单、自然的方式”是 loop-and-a-half(TM) 方式,尤其是因为 [just-one-fscking-]until 方式要困难得多掌握比“无限循环中断”......真正的pythonic,PEP排泄方式。 PS:直到不在 Python 中的唯一原因是因为他们找不到将其合并到强制缩进语法中的合理方法(至少函数式语言通过尾递归来弥补这一点)。
我会倾向于 @Bort 的目标,如果你想保证第一次运行,那么在 while 循环之前 do_something()
。它不是 DRY,但我认为它最易读。 do_something() while condition do_something()
。 @Brandon 发布的文章将其称为sentinel loop
。归根结底,这是一个留给 linter、代码库一致性和/或团队选择的风格选择。每次我看到while True
时,我都担心它永远不会结束,这就是为什么我喜欢看到用 while 行设置的条件,即使它不是 DRY;我不想寻找休息或消化疯狂的逻辑树【参考方案2】:
我更喜欢使用循环变量,因为它读起来比“while 1:”更好,而且没有难看的break
语句:
finished = False
while not finished:
... do something...
finished = evaluate_end_condition()
【讨论】:
我也喜欢这个,因为它比其他一些替代品更具可读性【参考方案3】:没有预先打包的“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
循环中使用的生成器几乎没有(理想情况下没有)“循环控制逻辑”(与更新下一个循环段的状态变量和/或测试是否应该再次循环)。
【讨论】:
你可以使用itertools.takewhile。 请注意,takewhile 还会消耗序列/生成器中不满足谓词函数的第一个元素 - 这就是它知道停止获取的方式。但是,如果您想遍历其余部分,认为“现在我将得到谓词为 False 的所有内容”,您将错过其中的第一项。【参考方案4】:不,没有。而是使用while
循环,例如:
while 1:
...statements...
if cond:
break
【讨论】:
为什么是while 1
? while True
有什么问题?为什么要强制从 int 转换为 bool?
@S.Lott,实际上,在 Python 2.X 中,True/False 不是关键字,它们只是内置在全局常量中(可以像任何其他变量一样重新分配),因此解释器必须检查他们指向什么。见***.com/a/3815387/311220
Python 2.7.3 $ python -mtimeit 'while 0:pass' 100000000 次循环,最好的 3:每个循环 0.0132 微秒 $ python -mtimeit 'while False:pass' 10000000 次循环,最好的 3:每个循环 0.0538 微秒
@jpmc26 我只是支持0
和1
比False
和True
快的说法。对于另外 3% 的用户,知道(可能违反直觉)1
比 True
更快会有所帮助。
@jpmc26 我使用 Python 进行编程竞赛以缩短开发时间。有时,在难以移植的解决方案中,紧密的数值循环是瓶颈,将“True”切换为1
会使我的解决方案从“超出时间限制”变为“正确”,大约 10%-20%速度增加。仅仅因为你从来不需要优化,它就没有它的用途。以上是关于Python中有“做......直到”吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章