当前位置:  开发笔记 > 编程语言 > 正文

在Python中有"做......直到"吗?

如何解决《在Python中有"做直到"吗?》经验,为你挑选了4个好方法。

Python中没有do-while循环.

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

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

顺便说一句,这被称为"循环半".Python继续支持这种结构,因为它是正确编写和理解的最简单的循环模式之一.见http://www.cs.duke.edu/~ola/patterns/plopd/loops.html#loop-and-a-half (36认同)

@Bort循环半结构保证`do_something()`至少执行一次,即使`condition()`在循环开始时为真.你的`while not condition():do_something()`构造将永远不会执行`do_something()`如果`condition()`在开始时计算为true. (10认同)

@brandon是的,"简单,自然的方式"是循环半(TM)的方式,特别是因为[just-one-fscking-]直到方式比"无限循环中断"更难掌握"......真正的pythonic,PEP排泄方式.PS:直到不在Python中的唯一原因是因为他们没有找到将其合并到强制缩进语法中的合理方法(至少函数式语言通过尾递归来补偿它). (5认同)

@Brandon这有什么不同:`while!condition do_something()`? (3认同)


Alex Martell.. 24

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

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

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



1> theycallmemo..:

Python中没有do-while循环.

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

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


顺便说一句,这被称为"循环半".Python继续支持这种结构,因为它是正确编写和理解的最简单的循环模式之一.见http://www.cs.duke.edu/~ola/patterns/plopd/loops.html#loop-and-a-half
@Bort循环半结构保证`do_something()`至少执行一次,即使`condition()`在循环开始时为真.你的`while not condition():do_something()`构造将永远不会执行`do_something()`如果`condition()`在开始时计算为true.
@brandon是的,"简单,自然的方式"是循环半(TM)的方式,特别是因为[just-one-fscking-]直到方式比"无限循环中断"更难掌握"......真正的pythonic,PEP排泄方式.PS:直到不在Python中的唯一原因是因为他们没有找到将其合并到强制缩进语法中的合理方法(至少函数式语言通过尾递归来补偿它).
@Brandon这有什么不同:`while!condition do_something()`?

2> Alex Martell..:

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

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

通常最好将更多的循环逻辑封装到您的生成器(或其他迭代器)中 - 例如,如果您经常遇到一个变量增加的情况,一个减少,并且您需要一个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](https://docs.python.org/2/library/itertools.html#itertools.takewhile).

3> PaulMcG..:

我更喜欢使用循环变量,因为它倾向于读取比"1:"更好一点,并且没有丑陋的break语句:

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



4> f0b0s..:

不,没有.而是使用如下的while循环:

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


@ jpmc26我使用Python进行编程竞赛以减少开发时间.有时,在一个难以移植的解决方案中,一个紧密的数字循环是瓶颈,并且将"True"切换为"1"会使我的解决方案从"超出时间限制"变为"正确",一个微小的~10%-20%速度提高.仅仅因为你从来没有需要优化,它没有它的用​​途.
Python 2.7.3 $ python -mtimeit'而0:传递'100000000循环,最好的3:0.0132 usec每循环$ python -mtimeit'而False:传递'10000000循环,最佳3:0.0538 usec每循环
为什么`1岁时?"真实"时有什么问题?为什么强制从int转换为bool?
@ S.Lott,实际上,在Python 2.X中,True/False不是关键字,它们只是构建在全局常量中(可以像任何其他变量一样重新分配),因此解释器必须检查它们指向的内容.请参见http://stackoverflow.com/a/3815387/311220
@jpmc26我只是支持声称"0"和"1"比"假"和"真"快.对于其他3%,有助于知道(可能违反直觉)"1"比"真"更快.
"口译员必须检查他们指出的内容"?什么?你是否声称这是一种有用的优化?如果是这样,你是否有'timeit`基准来证实这种说法?
@yingted"我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源." -Donald Knuth明显过快了,我说.
推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有