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 循环时使用带有内部 if-break 的 while-True 形式。
动机
通常需要在每次评估 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
上次修改: 2023-09-09 17:39:29 GMT