而真实vs而{condition}

时间:2014-12-16 19:46:19

标签: python python-3.x while-loop

我正在读一本关于Python3的书(由Bill Lubanovic介绍Python),并且发现了一些我不确定是Python偏好的东西,还是只是简单的""由于是一本书并试图描述别的东西。

关于如何使用块而不是一次性写入文件。

poem = '''There was a young lady named Bright,
Whose speed was far faster than light;
She started one day
In a relative way,
And returned on the previous night.'''

fout = open('relativity', 'wt')
size = len(poem)
offset = 0
chunk = 100
while True:
    if offset > size:
        break
    fout.write(poem[offset:offset+chunk])
    offset += chunk
fout.close()

我打算问为什么它有while True而不是while (offset > size),但我决定自己尝试一下,看到while (offset > size)实际上并没有做任何事情。 Python控制台。

这只是控制台中的一个错误,或者Python真的要求你在while循环中移动条件吗?通过所有更改使其尽可能小,这看起来非常冗长。

(我来自Java,C#和JavaScript的背景,其中作为循环定义的条件是标准的。)

修改

感谢xnx的评论,我意识到我的逻辑不正确我会有什么条件。

这让我回到了一个更清晰的问题,我最初想要关注的是:

Python是否更喜欢while True并且条件在循环中使用break,或者这只是对作者的一个疏忽,因为他试图解释一个不同的概念?

6 个答案:

答案 0 :(得分:1)

  

我打算问为什么它有True而不是while(offset< = size),但是我决定自己尝试一下,

这实际上是我写的方式。它应该在逻辑上是等同的。

  

并且看到while(offset> size)实际上并没有在我的Python控制台中执行任何操作。

您需要使用(offset <= size),而不是(offset > size)。当offset大于size时,当前逻辑停止,因此如果要将其置于while语句中,请反转条件。

  

Python真的要求你像这样在while循环中移动条件吗?

不,Python允许您直接在while循环中写入条件。两种选择都很好,而且在编写逻辑方面,这更多地取决于个人偏好。正如你所建议的那样,我更喜欢原始作者版本的简单形式。

这应该可以正常工作:

while offset <= size:
    fout.write(poem[offset:offset+chunk])
    offset += chunk

有关详细信息,请参阅while的文档,其中明确指出可以在:之前使用任何表达式。


编辑:

  

Python是否更喜欢在True中使用并且条件在循环中使用了一个中断,或者这只是对作者的一个疏忽,因为他试图解释一个不同的概念?

Python不喜欢while True:。两个版本都很好,这完全是编码器的首选问题。我个人更喜欢将表达式保留在while语句中,因为我发现代码使用while offset <= size:更清晰,更简洁,更易于维护。

答案 1 :(得分:1)

将条件放在循环中是合法的Python代码。我个人认为:

while offset <= size:

比以下更清楚:

while True:
    if offset < size:
        break

我更喜欢第一种形式,因为要遵循的分支较少,但逻辑并不复杂。在所有其他条件相同的情况下,较低的缩进程度更易于阅读。 如果有多个不同的条件会突破循环,那么最好采用while True语法。

对于使用不正确的循环逻辑观察到的行为,请考虑以下代码段:

size = len(poem)
offset = 0

while offset > size:
    #loop code

永远不会输入while循环,因为offset > size从false开始。

答案 2 :(得分:1)

while True:
    if offset > size:
        break
    func(x)

完全等同于

while offset <= size:
    func(x)

他们都跑到偏移&gt;尺寸。它只是一种不同的表达方式 - 两者都是可以接受的,而且我不知道任何性能差异。如果您在while循环底部(即func(x)之后)有休息条件,它们只会以不同的方式运行

编辑:

根据the Python wiki,在Python 2中。*“它减慢了很多事情”将条件置于while循环中:“这是由于首先测试True的条件,然后再次测试“休息条件。我不知道他们用什么措施“很多”,但它似乎微不足道。

答案 3 :(得分:1)

  

Python是否喜欢在True时执行并且条件使用中断   在循环内部,或者只是对作者的疏忽   他试图解释一个不同的概念?

不,不,这是作者自己的怪癖或错误。

在某些情况下,典型的Python风格(和Guido van Rossum)积极建议使用while True,但这不是其中之一。也就是说,他们也不会 disadvise 它。我想有些情况下,测试会更容易阅读和理解为“说什么时候打破”而不是“说何时继续”。即使它们只是对彼此的逻辑否定,一个或另一个可能会使表达的事情更简单:

while not god_unwilling() and not creek_risen():
while not (god_unwilling() or creek_risen()):

VS

while True:
    if god_unwilling() or creek_risen():
        break

我仍然喜欢第一个,但是YMMV。甚至可以更好地介绍与英语成语相对应的功能:god_willing()creek_dont_rise()

“必要”用法是指你想在循环的结尾或中间执行中断测试(也就是说,当你想第一次无条件地执行部分或全部循环时)。在其他语言有更多种类更复杂的循环结构的情况下,其他示例使用变量来玩游戏来决定是否中断,Guido说“只使用while True”。以下是常见问题解答中的示例,适用于loop that starts with an assignment

C代码:

while (line = readline(f)) {
    // do something with line
}

Python代码:

while True:
    line = f.readline()
    if not line:
        break
    # do something with line

FAQ备注(这与典型的Python风格有关):

  

一个有趣的现象是大多数有经验的Python程序员   认识while True成语,似乎没有错过   表达构造中的赋值很多;它只是新人   表达强烈希望将其添加到语言中。

它还指出,对于这个特定的例子,你实际上可以用for line in f来避免整个问题。

答案 4 :(得分:1)

从文件中读取时,通常会

output = []
while True:
    chunk = f.read(chunksize)
    if len(chunk) == 0:
        break
    output.append(chunk)

在我看来,作者更习惯于阅读而不是写作,在这种情况下,使用while True的阅读习惯已经泄露到写作代码中。

正如回答这个问题的大多数人都可以证明的那样,简单地使用while offset <= size可能更像Pythonic并且更简单,但更简单可能就是

f.write(poem)

因为底层I / O库可以为您处理分块写入。

答案 5 :(得分:-2)

在我看来,而True 比其他方式更好,在大型程序中;它有很长的代码。因为你实际上看不到变量可能因某些功能等而改变。意味着启动,如果它是真的意味着启动这个循环除了关闭之外发生的任何事情程序。因此,本书的作者可能希望您过去使用而真实,其风险要小于其他人。

最好用而True 并定义可能会停止此循环的变量。