亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python不設計do-while?循環結構的理由有哪些

發布時間:2022-01-21 09:16:03 來源:億速云 閱讀:156 作者:小新 欄目:開發技術

這篇文章主要介紹了Python不設計do-while 循環結構的理由有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

在某些編程語言中,例如 C/C++、C#、PHP、Java、JavaScript 等等,do-while 是一種基本的循環結構。

它的核心語義是:先執行一遍循環體代碼,然后執行一遍條件語句,若條件語句判斷為真,則繼續執行循環體代碼,并再次執行條件語句;直到條件語句判斷為假,則跳出循環結構。

流程圖如下(Java 示例):

Python不設計do-while?循環結構的理由有哪些

// 打印小于 20 的數字
public class Test {
   public static void main(String[] args){
      int x = 10;
      do {
         System.out.print("value of x : " + x );
         x++;
         System.out.print("\n");
      } while(x < 20);
   }
}

Python 并不支持 do-while 結構,“do”并不是一個有效的關鍵字。

那么,為什么 Python 不提供這種語法結構呢,這種現狀的背后有何種設計考量因素呢?

在回答這個問題之前,讓我們再仔細思考一下 do-while 語法可以解決什么問題,看看使用這種結構能帶來什么好處?

最顯而易見的好處是:do-while 語法保證了會先執行一遍循環體代碼。

它的使用場景也許不多,但是,跟普通的 while 循環或者 for 循環語法的“條件前置”思想不同,它體現的是一種“條件后置”的編程邏輯,也是一種控制循環的常見方式。

它們的關系似乎有點像 C/C++ 這些語言中的i++++i操作的區別,在某些特殊場合中,也許會更為高效。

除了這一特點,這種結構最大的應用場景其實是在 C/C++ 中特殊的do {...} while (0) 用法。這在很多開源項目的源碼中都能找到蹤跡,例如 Linux、Redis 以及 CPython 解釋器,等等。

這里面的數字 0 表示布爾值 False,意味著循環只會執行一遍,然后就跳出。

這樣的寫法是不是很詭異?所謂“循環”,一般就意味著程序體會被反復執行多次,但是,do {...} while (0) 卻偏偏只需要它執行一遍,這初看起來是有點多余啊。

這種寫法主要用在宏函數的定義中,可以解決宏代碼塊的編譯問題,使代碼按照我們的意圖而合理分塊。

另外,do {...} while (0) 結合 break 使用,還可以實現很優雅的跳轉控制效果。

在下面的示例中,步驟 1、4 和 5 要求必須執行,而步驟 2 取決于步驟 1 的執行結果,步驟 3 則取決于步驟 2 的執行結果。

do {
  // 執行步驟 1 
  if (條件1失敗) {
    break;
  }
  // 執行步驟 2 
  if (條件2失敗) {
    break;
  }
  // 執行步驟 3 
  if (條件3失敗) {
    break;
  }
} while(0);
// 執行步驟 4
// 執行步驟 5

在這種場景中,我們確實只需要按照順序執行一遍。do-while 結構很清晰,避免造成多層條件嵌套或者設置諸多額外標記的局面。

最后還有一點,在匯編層面,do-while 比 while 更接近匯編語言的邏輯,可以節省使用指令,在過去的低內存時代,算得上是一種優化寫法。

分析完 do-while 的好處后,讓我們回到主題:Python 為什么不需要設計 do-while 循環語法呢?

首先,Python 離底層應用編程太遠了,就不用考慮匯編指令的優化了,同時,它也不涉及宏的使用。

至于“條件前置”和“條件后置”的區別,其實并沒有太大影響,而且,由于 Python 使用簡潔優雅的縮進加冒號語法來劃分代碼塊,導致直譯過來的 do-while 語法看起來會很怪異(注意,直譯的 while 的條件后沒有其它內容):

do:
    pass
while False

想要引入新的語法特性,必然要遵守既定的風格習慣。其它語言的 do-while 結構直譯成 Python 的話,肯定不合適。

事實上,在 2003 年時,有一個 PEP 提議給 Python 加上 do-while 語法支持:

Python不設計do-while?循環結構的理由有哪些

PEP-315 Enhanced While Loop

該 PEP 提議增加一個可選的 do 子句,支持將 while 循環擴展成這樣子:

do:
    <setup code>
while <condition>:
    <loop body>

這不是簡單地從其它語言翻譯成 Python,它的 while 語句后保留了 Python 的縮進用法,并不會造成直譯形式的突兀結果。

加上 while 循環本身已支持的可選的 else 子句,因此,while 完整的語法結構是這樣的:

while_stmt : ["do" ":" suite]
            "while" expression ":" suite
            ["else" ":" suite]

(PS.在本系列的下一篇文章,我們將解釋為什么 Python 要支持 while-else 語法)

也就是說,在保持原 while 循環語法不變的情況下,PEP-315 提議支持在 while 前面使用一個可選的 do 子句。

do 子句只會執行一遍,當它里面出現 break 時,則跳出整個 do-while 循環;當 do 子句中出現 continue 時,則跳出 do 子句,進到 while 的條件判斷中。

有了 do 子句后,很容易就能實現 do {...} while (0) 的跳轉控制效果。

但是,這個 PEP 遭到了一些核心開發者的反對。

反對的理由是,不需要引入新的關鍵字和語法,僅使用現有語法就能很好地實現同樣的功能:

while True:
    <setup code>
    if not <condition>:
        break
    <loop body>

Python 之父 Guido van Rossum 也持反對意見,他的原話是:

Python不設計do-while?循環結構的理由有哪些

Please reject the PEP. More variations along these lines won't make the
language more elegant or easier to learn. They'd just save a few hasty
folks some typing while making others who have to read/maintain their code wonder what it means.

簡單翻譯一下,這種 do-while 語法并不會使 Python 更優雅好用,反而會產生閱讀/維護代碼的理解負擔。

就個人的感覺而言,我也不贊成引入 PEP-315 那種可選的 do-while 語法,雖然它比固定形式的 do-while 結構更為靈活和優雅一點。

最后稍微總結一下,do-while 作為一種常見的循環結構,在其它語言中有所發揮,它甚至還發展出了 do {...} while (0) 的典型用法,但是,do-while 能夠解決的幾個問題要么在 Python 中并不存在(宏定義、匯編指令),要么就是已經有更為合適而低成本的實現(跳轉控制)。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Python不設計do-while 循環結構的理由有哪些”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安西县| 永昌县| 安远县| 博罗县| 新郑市| 昌乐县| 保康县| 玉屏| 江津市| 宜黄县| 阿拉善盟| 普定县| 辽阳市| 乐昌市| 崇信县| 娄烦县| 茌平县| 乌鲁木齐县| 彭山县| 贵定县| 盐城市| 德兴市| 南召县| 东乡县| 淮滨县| 四会市| 郸城县| 永吉县| 容城县| 米脂县| 新密市| 甘南县| 锡林郭勒盟| 海淀区| 蓬安县| 长兴县| 台北市| 正阳县| 元氏县| 金寨县| 钟山县|