PEP 315 – 增强的 While 循环
- 作者:
- Raymond Hettinger <python at rcn.com>, W Isaac Carroll <icarroll at pobox.com>
- 状态:
- 已拒绝
- 类型:
- 标准跟踪
- 创建日期:
- 2003年4月25日
- Python 版本:
- 2.5
- 发布历史:
摘要
本 PEP 提议在 while 循环的开头添加一个可选的“do”子句,以使循环代码更清晰,并减少因代码重复引起的错误。
注意
已拒绝;参见 [1]。
本 PEP 自2006年以来已被推迟;参见 [2]。
2009年4月,后续试图复兴该 PEP 的努力未能成功,因为没有出现能与以下形式竞争的语法
while True:
<setup code>
if not <condition>:
break
<loop body>
为基本的 do-while 循环找到了一种不同于 PEP 中提议的语法替代方案,但由于条件在顶部,它几乎没有得到支持
do ... while <cond>:
<loop body>
建议语言用户在适合 do-while 循环时使用 while-True 形式和内部 if-break。
动机
在每次评估 while 循环条件之前,通常需要执行一些代码。这些代码常常在循环外部重复,作为在进入循环前执行一次的设置代码
<setup code>
while <condition>:
<loop body>
<setup code>
问题在于,如果其中一个实例被修改而另一个没有,重复的代码就可能成为错误的来源。此外,设置代码的第二个实例的目的不明确,因为它出现在循环的末尾。
可以通过将循环条件移到辅助函数或循环体中的 if 语句中来防止代码重复。然而,将循环条件与 while 关键字分离会使循环的行为变得不那么清晰
def helper(args):
<setup code>
return <condition>
while helper(args):
<loop body>
这最后一种形式的额外缺点是需要将循环的 else 子句添加到 if 语句的主体中,进一步模糊了循环的行为
while True:
<setup code>
if not <condition>: break
<loop body>
本 PEP 提议通过在 while 循环中添加一个可选子句来解决这些问题,该子句允许以自然的方式表达设置代码
do:
<setup code>
while <condition>:
<loop body>
这使得循环条件与其所属的 while 关键字保持在一起,并且不需要重复代码。
语法
while 语句的语法
while_stmt : "while" expression ":" suite
["else" ":" suite]
扩展如下
while_stmt : ["do" ":" suite]
"while" expression ":" suite
["else" ":" suite]
break 和 continue 的语义
在 do-while 循环中,break 语句的行为与标准 while 循环中的行为相同:它将立即终止循环,而无需评估循环条件或执行 else 子句。
do-while 循环中的 continue 语句会跳转到 while 条件检查处。
通常,当 while 套件为空(一个 pass 语句)时,do-while 循环以及 break 和 continue 语句应与其他语言中 do-while 的语义匹配。
同样,当 do 套件为空时,do-while 循环以及 break 和 continue 语句应与常规 while 循环中发现的行为匹配。
未来声明
由于新增了关键字“do”,该语句
from __future__ import do_while
最初将要求使用 do-while 形式。
实施
本 PEP 的第一个实现可以将 do-while 循环编译为带有一个退出循环的测试的无限循环。
参考资料
版权
本文档已置于公共领域。
来源: https://github.com/python/peps/blob/main/peps/pep-0315.rst
最后修改: 2025-02-01 08:59:27 GMT