gpt4 book ai didi

python - python 循环/关键字的暗角。风格建议

转载 作者:太空宇宙 更新时间:2023-11-04 08:06:57 24 4
gpt4 key购买 nike

学习python,发现这段代码片段。它从 stdin 读取文本并在完成时打印“完成”。我从未在任何其他语言的其他地方看到过用于 while 循环的 else。我发现它的网站上的评论说这是一种类似于 finally 的 pythonic 方式,但需要一段时间的循环。

import sys
while True:
line = sys.stdin.readline()
if not line:
break
else:
print("Done");

问题是,这是pythonic吗?我工作的地方有非常严格的 pep-8 合规政策,所以我需要知道这是否可以。

最佳答案

使用 while/else 的基本思想当然是 Pythonic——否则它不会出现在语言中。

但是,您的代码中有两个错误,每个错误都意味着您的 else 代码永远不会运行。包含永远不会执行并且只是为了误导读者的代码可能不是 Pythonic。 :) 更重要的是,这可能不是您想要的。


首先,您永远无法退出循环(异常(exception)情况除外)。 readline 在 EOF 处返回一个空字符串,所以这可能是您要检查的内容:

while True:
line = sys.stdin.readline()
if line:
print(line)
else:
break
else:
print("Done")

但接下来,我不确定 while/else 是否如您所想。我想你期望它运行 else 但是你退出循环。但是作为the docs解释:

A break statement executed in the first suite terminates the loop without executing the else clause’s suite.

换句话说,else 部分仅在您正常 退出时运行,条件变为假。显然 while True 永远不会变成 false。

这就是重点:有时您需要区分循环正常结束还是以 if something: break; 退出;那就是你使用 else: 的时候。如果您想以任何一种方式做同样的事情,那就去做吧:

while True:
line = sys.stdin.readline()
if line:
print(line)
else:
break
print("Done")

如果你想要“类似于finally”的东西,因为你可能有异常(exception),答案很简单:使用finally:

try:
while True:
line = sys.stdin.readline()
if line:
print(line)
else:
break
finally:
print("Done")

作为旁注,使用 whilebreak 循环遍历 readline 几乎从不需要;像 sys.stdin 这样的类文件对象是可迭代的行,readline 将返回相同的行,所以你可以这样做:

for line in sys.stdin:
print(line)
print("Done")

作为旁注,在代码中使用不必要的括号和分号通常被认为是 Pythonic — 尤其是当它使您的代码看起来像 C 或 Java 或其他东西的误导性时。同时PEP 8仅作为 Python stdlib 的标准,许多人将其用作他们自己的 Python 软件的指南,除非您有充分的理由不这样做,否则遵循其建议是个好主意。您可以使用 pep8 等工具检查您是否遵循指南。这只捕获简单的东西,比如你的 while(True): 而不是 while Trueprint("Done"); 而不是 print("Done"),但违反这些简单的内容会分散读者的注意力,使他们无法注意到您所询问的可能存在的更高级别的违规行为。

关于python - python 循环/关键字的暗角。风格建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29573117/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com