Python為什么不支持switch語句

本篇內(nèi)容主要講解“Python為什么不支持switch語句”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python為什么不支持switch語句”吧!

成都創(chuàng)新互聯(lián)專注于昌邑網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供昌邑營銷型網(wǎng)站建設(shè),昌邑網(wǎng)站制作、昌邑網(wǎng)頁設(shè)計(jì)、昌邑網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造昌邑網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供昌邑網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

1、switch 是什么?

switch 的語法格式如下:

switch(expression){     case value1:        // 語句        break; // 可選     case value2:        // 語句        break; // 可選     default: // 可選        // 語句 }

它的用法不難理解:switch 語句的值滿足哪一個(gè) case 情況,就會執(zhí)行對應(yīng)的代碼塊,執(zhí)行時(shí)遇到 break 就跳出,否則就繼續(xù)執(zhí)行下一個(gè) case  分支;一般會在最后放一個(gè) default 分支,作為兜底。

大多數(shù)語言都提供了 switch 語句或者極其相似的東西,例如,在 C/C++/Java /Go 等靜態(tài)語言中,它們都支持 switch-case  結(jié)構(gòu);在 Ruby 中有類似的 case-when 結(jié)構(gòu),在 Shell 語言中,有相似的 case-in 結(jié)構(gòu),在 Perl 中,有  switch-case-else……

switch 語句的好處是支持“單條件多分支”的選擇結(jié)構(gòu),相比 if-else 的二分選擇結(jié)構(gòu),在某些時(shí)候會更為簡潔清晰。

但是,在 Python 中,我們看不到 switch-case 或者相近的語法結(jié)構(gòu),這是為什么呢?

2、Python 為什么不支持 switch?

官方文檔中有一篇 FAQ 包含了這個(gè)問題:Why isn’t there a switch or case  statement in Python?

FAQ 即 Frequently Asked Questions 的縮寫,表示常見問題,官方列了 27  個(gè)常見問題

該文檔給出了幾個(gè)建議,告訴了我們幾個(gè) switch/case 的替代方案:

  • 使用 if-elif-else 條件判斷語句

  • 使用字典,將 case 值與調(diào)用的函數(shù)映射起來

  • 使用內(nèi)置 getattr() 檢索特定的對象調(diào)用方法

曾有人提出過一些提案(即 PEP-275 和 PEP-3103),想給 Python 引入 switch  語法,然而,對于“是否以及如何進(jìn)行靶場測試”,大家沒有達(dá)成一致的共識。

靶場測試,即 range test,指的是對武器彈藥的技術(shù)性能作各種測試驗(yàn)證,與藥物的臨床試驗(yàn)一樣,都是在最終產(chǎn)品交付前的一項(xiàng)關(guān)鍵性測試。

官方文檔對于“為什么 Python 不引入 switch”的解釋,實(shí)際上來源于 Python 之父 Guido van Rossum 在 PEP-3103  中的意見:

A quick poll during my keynote presentation at PyCon 2007 shows this proposal  has no popular support. I therefore reject it.

我在 PyCon 2007 的主題演講中做了一個(gè)快速的民意調(diào)查,結(jié)果表明這個(gè)提案沒有得到廣泛的支持。因此,我拒絕了它。

簡而言之,PEP 提案有了,語法實(shí)現(xiàn)也有了雛形,但是核心開發(fā)者們似乎沒有達(dá)成一致意見,最終導(dǎo)致提案流產(chǎn)了。

3、PEP-275 與 PEP-3103 說了什么?

PEP-3103 是在 2006 年提出的,PEP-275 則是在 2001  年提出的,它們的共同之處是提出了引入 switch 語句的某種必要性、分析了好幾種備選的實(shí)現(xiàn)方案,然而,結(jié)局是都被拒絕了。

那么,我們就先來回顧一下核心開發(fā)者們都做出了哪些討論,看一看如果 Python 要實(shí)現(xiàn) switch 結(jié)構(gòu),會是怎么樣子的?(PS:PEP  里還涉及其它內(nèi)容,本文只摘取與 switch 直接相關(guān)的部分)

PEP-275 提出的語法結(jié)構(gòu)如下:

switch EXPR:     case CONSTANT:         SUITE     case CONSTANT:         SUITE     ...     else:         SUITE

其中 else 分支是可選的,如果沒有它,并且前面的分支都不滿足的話,就什么也不做。另外 case 值 constant 支持不同類型,因?yàn)?expr  表達(dá)式的類型是動態(tài)的。

PEP-275 還提出讓 switch 不支持掉落(fall-through)行為,即每個(gè) case 分支相互獨(dú)立而完整,不用像 C 語言那樣需要寫  break。

該 PEP 還列舉了一些其它的 issue:

  • 重用現(xiàn)有關(guān)鍵字,不引入“switch”和“case”

  • 使用新的關(guān)鍵字,避免與 C 的 switch 概念混淆

  • 支持單分支多值選擇(例如:case 'a', 'b', 'c': …)

  • 還有建議支持范圍取值判斷(例如:case 10..14: …)

除了首選方案,該 PEP 還記錄了幾種風(fēng)格各異的語法方案:

case EXPR:     of CONSTANT:         SUITE     of CONSTANT:         SUITE     else:         SUITE  case EXPR:     if CONSTANT:          SUITE     if CONSTANT:         SUITE     else:         SUITE  when EXPR:     in CONSTANT_TUPLE:         SUITE     in CONSTANT_TUPLE:         SUITE     ... else:      SUITE

PEP-275 記錄下了不少重要的思路和問題,為 PEP-3103 的出現(xiàn)做了很好的鋪墊。

那么,我們再來看看由 Guido 編寫的 PEP-3103 說了些什么吧。

它首先認(rèn)可了 PEP-275 中的兩個(gè)基礎(chǔ)設(shè)定,例如,實(shí)現(xiàn)“隱式的 break”,不讓 case 分支出現(xiàn) fall-through  這種轉(zhuǎn)移控制權(quán)的情況(其它語言似乎都要求顯式地寫 break);else 分支是可選的,復(fù)用 else 關(guān)鍵字,而不用引入“default”。

對于 PEP-275 提倡的那種風(fēng)格,Guido 比較認(rèn)可,但也認(rèn)為它的問題是縮進(jìn)層次太多,因此建議減少代碼分支縮進(jìn)的空格數(shù),例如本來縮進(jìn) 4  空格,改為縮進(jìn) 2 空格。

PEP-3103 還列舉了另外三種實(shí)現(xiàn)方案,分析了它們的差異以及問題,具體內(nèi)容從略,這里只給大家看看它們的風(fēng)格:

# case 分支不縮進(jìn) switch EXPR: case EXPR:     SUITE case EXPR:     SUITE .... else:     SUITE  # switch 語句后不加冒號 switch EXPR case EXPR:     SUITE case EXPR:     SUITE .... else:     SUITE  # 省略 case 關(guān)鍵字 switch EXPR:     EXPR:         SUITE     EXPR:         SUITE     ...     else:         SUITE

在基礎(chǔ)語法之外,Guido 花了很多篇幅來討論擴(kuò)展語法(Extended Syntax),即在一個(gè) case 分支中實(shí)現(xiàn)匹配多個(gè)值的復(fù)雜情況:

case EXPR, EXPR, ...:  # Guido 優(yōu)選的 case in EXPR_LIST:  case *EXPR:  case [*]EXPR, [*]EXPR, ...:  case *(EXPR, EXPR, ...):

他重點(diǎn)考慮到的問題包括:switch 中表達(dá)式的結(jié)果是元組或可迭代對象的情況、case 的值被看成元組解包的情況、在 case  分支作“*”星號操作……

接著,Guido 又用了非常非常多的篇幅來分析該如何實(shí)現(xiàn) switch,其中討論到的主要思路有:

  • 使用等價(jià)的 if-elif 鏈來定義 switch 語句(可能會做些優(yōu)化)

  • 同上,另外所有表達(dá)式都必須是可哈希的(hashable)

  • 看作是預(yù)先計(jì)算的字典的分派(dispatch)

PEP 中這部分的內(nèi)容非常多,因?yàn)樵诿總€(gè)思路上,Guido 還考慮到了好幾種實(shí)現(xiàn)路徑,這導(dǎo)致了他在復(fù)雜分析后的結(jié)論是:It is too early to  decide( 現(xiàn)在做決定為時(shí)尚早)。

閱讀完 PEP-3103 后,我總體的感覺是:Guido 的思路非常發(fā)散、層次豐富,但是,缺少了他在面對其它問題時(shí)那“快刀斬亂麻”式的洞察力。

也就是說,在諸多的可能性方案中,他力求面面俱到,最終無法說服自己做出一個(gè)獨(dú)裁的決定。阻力主要來自于他自己,而不是其他人。

不過,之所以會出現(xiàn)這種情況,也許跟他的預(yù)設(shè)立場有關(guān):他似乎認(rèn)為“Python is fine without a switch  statement”,因此盡管寫了很長的 PEP,但只是在把問題復(fù)雜化,把議題擱置起來。

最后,他在 PyCon 上做了一個(gè)小范圍調(diào)查,借此“名正言順”地拒絕了自己發(fā)起的 PEP,試圖堵住眾人的悠悠之口……

4、未來會有 switch 語句么?

歸結(jié)起來,之所以 Python 沒有 switch 語句,原因有:switch 的實(shí)現(xiàn)細(xì)節(jié)/功能點(diǎn)未經(jīng)敲定、沒有  switch 也挺好的、有其它不錯(cuò)的方法替代 switch、Guido 的小任性……

但是,我們還是要追問一句:未來會有 switch 語句么?或者類似的多分支選擇結(jié)構(gòu)?

為什么要有此一問呢?原因是有太多語言自帶 switch 語句,而且也有很多人嘗試編寫提供 switch 功能的庫(我記得在 PyCoder's  Weekly 里曾見到過兩次)。

我(Python貓)本人自始至終并不喜歡 switch,幾乎可以肯定地說,Python 未來也不會有 switch,但是,它很可能會引入一個(gè)類似于  switch 且更為復(fù)雜的語法結(jié)構(gòu)!

2020 年 6 月,PEP-622 被提出了,它建議引入在 Scala、Erlang 和 Rust 等語言中的模式匹配語法(pattern  matching)。

以一個(gè)求平均數(shù)的函數(shù)為例,模式匹配語法可以實(shí)現(xiàn)成這樣:

def average(*args):     match args:         case [x, y]:           # captures the two elements of a sequence             return (x + y) / 2         case [x]:              # captures the only element of a sequence             return x         case []:             return 0         case x:                # captures the entire sequence             return sum(x) / len(x)

到此,相信大家對“Python為什么不支持switch語句”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)頁標(biāo)題:Python為什么不支持switch語句
文章網(wǎng)址:http://muchs.cn/article6/isjoig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、定制開發(fā)外貿(mào)建站、企業(yè)網(wǎng)站制作網(wǎng)站導(dǎo)航、營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管