Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

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 循环时使用 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