Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 增强提案

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