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