最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python?不設計?do-while?循環(huán)結(jié)構(gòu)的理由

 更新時間:2022年01月20日 16:41:25   作者:豌豆花下貓  
Python作為一種語言不支持do-while循環(huán)。?但是,我們可以采用一種變通方法來模擬do-while循環(huán)?。下面通過本文給大家分享下Python?不設計do-while?循環(huán)結(jié)構(gòu)的理由,需要的朋友可以參考下

在某些編程語言中,例如 C/C++、C#、PHP、Java、JavaScript 等等,do-while 是一種基本的循環(huán)結(jié)構(gòu)。

它的核心語義是:先執(zhí)行一遍循環(huán)體代碼,然后執(zhí)行一遍條件語句,若條件語句判斷為真,則繼續(xù)執(zhí)行循環(huán)體代碼,并再次執(zhí)行條件語句;直到條件語句判斷為假,則跳出循環(huán)結(jié)構(gòu)。

流程圖如下(Java 示例):

// 打印小于 20 的數(shù)字
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 結(jié)構(gòu),“do”并不是一個有效的關(guān)鍵字。

那么,為什么 Python 不提供這種語法結(jié)構(gòu)呢,這種現(xiàn)狀的背后有何種設計考量因素呢?

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

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

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

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

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

這里面的數(shù)字 0 表示布爾值 False,意味著循環(huán)只會執(zhí)行一遍,然后就跳出。

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

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

另外,do {...} while (0) 結(jié)合 break 使用,還可以實現(xiàn)很優(yōu)雅的跳轉(zhuǎn)控制效果。

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

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

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

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

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

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

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

do:
    pass
while False

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

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

PEP-315 Enhanced While Loop

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

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

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

加上 while 循環(huán)本身已支持的可選的 else 子句,因此,while 完整的語法結(jié)構(gòu)是這樣的:

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

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

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

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

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

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

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

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

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

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 更優(yōu)雅好用,反而會產(chǎn)生閱讀/維護代碼的理解負擔。

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

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

看完這篇文章,你是否還有其它補充的內(nèi)容呢?歡迎交流討論。

如果你對 Python 語言設計相關(guān)的話題感興趣,歡迎訂閱 Github 上的《Python為什么》系列文章(https://github.com/chinesehuazhou/python-whydo)

到此這篇關(guān)于Python 不設計 do-while 循環(huán)結(jié)構(gòu)的理由的文章就介紹到這了,更多相關(guān)Python do-while 循環(huán)結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python3.8安裝tensorflow的簡單方法步驟

    Python3.8安裝tensorflow的簡單方法步驟

    最近想要研究一下深度學習的應用,于是翻了翻了社區(qū)的tensorflow安裝教程,所以下面這篇文章主要給大家介紹了關(guān)于Python3.8安裝tensorflow的簡單方法步驟,需要的朋友可以參考下
    2022-06-06
  • 基于pandas向csv添加新的行和列

    基于pandas向csv添加新的行和列

    這篇文章主要介紹了基于pandas向csv添加新的行和列,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • 使用python-pptx操作PPT的示例詳解

    使用python-pptx操作PPT的示例詳解

    python對PPT演示文檔讀寫,是通過第三方庫python-pptx實現(xiàn)的,python-pptx是用于創(chuàng)建和更新?PowerPoint文件的?Python?庫。本文主要介紹了python-pptx操作PPT的相關(guān)示例,希望對大家有所幫助
    2023-01-01
  • Java多線程編程中ThreadLocal類的用法及深入

    Java多線程編程中ThreadLocal類的用法及深入

    這篇文章主要介紹了Java多線程編程中ThreadLocal類的用法及深入,嘗試了自己實現(xiàn)一個ThreadLocal類以及對相關(guān)的線程安全問題進行討論,需要的朋友可以參考下
    2016-06-06
  • python過濾字符串中不屬于指定集合中字符的類實例

    python過濾字符串中不屬于指定集合中字符的類實例

    這篇文章主要介紹了python過濾字符串中不屬于指定集合中字符的類,涉及Python針對字符串與集合的相關(guān)操作技巧,需要的朋友可以參考下
    2015-06-06
  • python gui開發(fā)——制作抖音無水印視頻下載工具(附源碼)

    python gui開發(fā)——制作抖音無水印視頻下載工具(附源碼)

    這篇文章主要介紹了python gui開發(fā)——制作抖音無水印視頻下載工具(附源碼)的相關(guān)資料,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下
    2021-02-02
  • Python判斷文件和文件夾是否存在的方法

    Python判斷文件和文件夾是否存在的方法

    這篇文章主要介紹了Python判斷文件和文件夾是否存在的方法,本文還講解了判斷是否為文件或者目錄的方法、os.path.lexist的作用、FTP中判斷文件或目錄是否存在等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • 五分鐘學會怎么用Pygame做一個簡單的貪吃蛇

    五分鐘學會怎么用Pygame做一個簡單的貪吃蛇

    這篇文章主要介紹了五分鐘學會怎么用Pygame做一個簡單的貪吃蛇,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • 將python flask項目打包成可以運行的軟件的全過程(包含報錯解決)

    將python flask項目打包成可以運行的軟件的全過程(包含報錯解決)

    這篇文章主要給大家介紹了將python flask項目打包成可以用運行的軟件(包含報錯解決),文中通過代碼示例和圖文結(jié)合講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2024-02-02
  • python使用xlsx和pandas處理Excel表格的操作步驟

    python使用xlsx和pandas處理Excel表格的操作步驟

    python的神器pandas庫就可以非常方便地處理excel,csv,矩陣,表格 等數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于python使用xlsx和pandas處理Excel表格的操作步驟,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-01-01

最新評論

民乐县| 铜川市| 商河县| 尤溪县| 米林县| 简阳市| 福州市| 天祝| 错那县| 阿克| 阿巴嘎旗| 石泉县| 黄冈市| 光泽县| 阳西县| 鹰潭市| 林州市| 万州区| 漳州市| 和田县| 洛浦县| 天全县| 蛟河市| 焉耆| 卢湾区| 黎平县| 抚州市| 抚远县| 长沙市| 黑河市| 太湖县| 黄冈市| 泸定县| 四川省| 化州市| 云浮市| 九江市| 文成县| 古蔺县| 涟源市| 邯郸市|