日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Python為何不支持switch語句原理詳解

瀏覽:16日期:2022-07-07 15:52:21

在這篇文章里,我們會聊一聊為什么 Python 決定不支持 switch 語句。

為什么想要聊這個話題呢?

主要是因為 switch 在其它語言中太常見了,而 Python 卻不支持,這樣的獨特性本身就值得關注,而回答這個問題,也能更加看清 Python 在程序設計上的理念,了解 Python 在語法設計中的決策過程。

本文除了會詳細分析 PEP-275 和 PEP-3103,還會介紹到 Python 最新的發展動態(PEP-622),即可能要引入的模式匹配(pattern matching)語法,相信這個話題會開闊大家的眼界,從而對 switch 語法有更為全面的認識。

1、switch 是什么?

在開始正題之前,我們需要先聊聊 switch 是什么?

一般而言,switch 的語法格式如下:

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

使用流程圖來表示,大概是這樣的:

Python為何不支持switch語句原理詳解

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

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

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

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

2、Python 為什么不支持 switch?

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

Python為何不支持switch語句原理詳解

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

使用 if-elif-else 條件判斷語句 使用字典,將 case 值與調用的函數映射起來 使用內置 getattr() 檢索特定的對象調用方法

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

靶場測試,即 range test,指的是對武器彈藥的技術性能作各種測試驗證,與藥物的臨床試驗一樣,都是在最終產品交付前的一項關鍵性測試。

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

Python為何不支持switch語句原理詳解

出處:https://www.python.org/dev/peps/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 的主題演講中做了一個快速的民意調查,結果表明這個提案沒有得到廣泛的支持。因此,我拒絕了它。

簡而言之,PEP 提案有了,語法實現也有了雛形,但是核心開發者們似乎沒有達成一致意見,最終導致提案流產了。

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

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

Python為何不支持switch語句原理詳解

出處:https://www.python.org/dev/peps/pep-0275/

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

PEP-275 提出的語法結構如下:

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

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

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

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

重用現有關鍵字,不引入“switch”和“case” 使用新的關鍵字,避免與 C 的 switch 概念混淆 支持單分支多值選擇(例如:case ’a’, ’b’, ’c’: ...) 還有建議支持范圍取值判斷(例如:case 10..14: ...)

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

case EXPR: of CONSTANT: SUITE of CONSTANT: SUITE else: SUITEcase EXPR: if CONSTANT: SUITE if CONSTANT: SUITE else: SUITEwhen EXPR: in CONSTANT_TUPLE: SUITE in CONSTANT_TUPLE: SUITE ...else: SUITE

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

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

它首先認可了 PEP-275 中的兩個基礎設定,例如,實現“隱式的 break”,不讓 case 分支出現 fall-through 這種轉移控制權的情況(其它語言似乎都要求顯式地寫 break);else 分支是可選的,復用 else 關鍵字,而不用引入“default”。

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

PEP-3103 還列舉了另外三種實現方案,分析了它們的差異以及問題,具體內容從略,這里只給大家看看它們的風格:

# case 分支不縮進switch EXPR:case EXPR: SUITEcase EXPR: SUITE....else: SUITE# switch 語句后不加冒號switch EXPRcase EXPR: SUITEcase EXPR: SUITE....else: SUITE# 省略 case 關鍵字switch EXPR: EXPR: SUITE EXPR: SUITE ... else: SUITE

在基礎語法之外,Guido 花了很多篇幅來討論擴展語法(Extended Syntax),即在一個 case 分支中實現匹配多個值的復雜情況:

case EXPR, EXPR, ...:

# Guido 優選的case in EXPR_LIST:

case *EXPR:

case [*]EXPR, [*]EXPR, ...:

case *(EXPR, EXPR, ...):

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

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

使用等價的 if-elif 鏈來定義 switch 語句(可能會做些優化) 同上,另外所有表達式都必須是可哈希的(hashable) 看作是預先計算的字典的分派(dispatch)

PEP 中這部分的內容非常多,因為在每個思路上,Guido 還考慮到了好幾種實現路徑,這導致了他在復雜分析后的結論是:It is too early to decide( 現在做決定為時尚早)。

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

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

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

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

4、未來會有 switch 語句么?

歸結起來,之所以 Python 沒有 switch 語句,原因有:switch 的實現細節/功能點未經敲定、沒有 switch 也挺好的、有其它不錯的方法替代 switch、Guido 的小任性……

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

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

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

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

Python為何不支持switch語句原理詳解

截至 2020 年 10 月,該 PEP 已被分解成另外三個 PEP(634-636),目前都處于草案階段??紤]到核心開發者們的參與情況以及話題討論的情況,這些提案極有可能會在未來版本(比如正在開發中的 3.10)中實現。

以一個求平均數的函數為例,模式匹配語法可以實現成這樣:

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)

match-case 結構神似于 switch-case 結構,然而它基于模式(pattern)而非表達式(expression),因此有更多待考慮的細節問題,也有更為廣闊的應用空間。

對此話題感興趣的讀者,建議去查閱這幾個新的 PEP。

最后,讓我們回到標題中的問題:Python 為什么不支持 switch 語句?

官方文檔的 FAQ 對此問題有一個解答,告訴我們有幾個不錯的替代寫法,同時也留下了一條線索:曾有 PEP 提議引入 switch,只是沒有成功實現。

沿著這條線索,本文拆解了 PEP-275 和 PEP-3103 這兩篇文檔,帶大家看到了 Python 社區里提出過的風格各異的 switch 方案,以及諸多的懸而未決的問題。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产视频一区二区在线播放| 亚洲在线电影| 国产调教一区二区三区| 香蕉久久一区| 日本欧美韩国一区三区| 一区二区日韩免费看| 伊人精品久久| 日韩精品一级| 久久爱www成人| 精品九九在线| 久久网站免费观看| 亚洲综合不卡| 日韩国产在线观看一区| 国产精品伦一区二区| 激情综合五月| 久久国产免费| 免费在线观看日韩欧美| 日韩激情综合| 精品午夜视频| 99久久久久| 国产农村妇女精品一区二区| 免费在线观看日韩欧美| 日韩av不卡一区二区| 久久亚洲人体| 欧美精品一二| 蜜桃视频在线观看一区二区| 69堂免费精品视频在线播放| 精品一区二区三区中文字幕| 日韩免费高清| 中文久久精品| 国产毛片精品| 99精品小视频| 日韩专区视频网站| 精品免费在线| 午夜日韩福利| 日本午夜精品久久久久| 国产福利91精品一区二区| 亚洲福利久久| 青青草91视频| 国产精品久久久久av电视剧| 久久亚洲色图| 国产成人精品免费视| 日韩一级欧洲| 精品视频自拍| 巨乳诱惑日韩免费av| 精品精品久久| 一区二区电影在线观看| 成人福利av| 日韩精品1区2区3区| 日韩精品免费一区二区三区| 视频一区视频二区中文字幕| 久久精品三级| 一区二区日韩免费看| 亚洲风情在线资源| 日韩一区二区三区高清在线观看| 国产一区二区三区探花| 蜜臀av一区二区在线免费观看| 免费在线观看一区| 麻豆91精品| 国产精品专区免费| 午夜精品影视国产一区在线麻豆| 日本不卡免费高清视频在线| 亚洲综合中文| 欧洲亚洲一区二区三区| 国产亚洲精品精品国产亚洲综合| 日韩精品一区二区三区免费观影 | 黄色在线网站噜噜噜| 中文字幕日韩亚洲| 伊人久久国产| 久久精品99久久久| 欧美福利专区| 精品一区二区三区中文字幕视频| 亚洲人成在线影院| 国产91精品对白在线播放| 国产精久久一区二区| 亚洲精品888| 天堂√8在线中文| 日韩激情中文字幕| 欧美午夜不卡| 日韩中文在线电影| 里番精品3d一二三区| 日本aⅴ免费视频一区二区三区| 亚州av乱码久久精品蜜桃| 国内精品亚洲| 国产精品一区二区中文字幕| 亚洲人成亚洲精品| 中文在线不卡| 激情久久五月| 韩国精品主播一区二区在线观看 | 深夜视频一区二区| 久久影院资源站| 国产亚洲一区| 色狠狠一区二区三区| 日韩天堂av| 极品日韩av| 日本精品不卡| 中文字幕高清在线播放| 精品三级在线| 欧美国产另类| 国产精品草草| 国产精品乱战久久久| 欧美一区二区三区久久精品| 首页欧美精品中文字幕| 不卡av一区二区| 日韩精品一区二区三区免费观影| 久久香蕉网站| 另类欧美日韩国产在线| 欧美一区自拍| 日韩福利在线观看| 日韩中文av| 日韩av一区二区在线影视| 婷婷精品在线| 日韩精品电影一区亚洲| 亚洲91网站| 日韩欧美2区| 欧美一区成人| 国产九九精品| 国产欧美激情| 国产精品久久久久久妇女| 久久不见久久见国语| 久久av导航| 精品无人区麻豆乱码久久久| 久久精品九色| 色乱码一区二区三区网站| 福利精品一区| 日韩欧美不卡| 欧美日韩国产一区二区三区不卡| 黄色成人91| 免费看精品久久片| 美日韩精品视频| 日本亚洲欧美天堂免费| 欧美在线看片| 国产福利资源一区| 国产一区二区三区视频在线| 欧美日韩免费观看视频| 美女性感视频久久| 精品国产鲁一鲁****| 国产精品3区| 麻豆精品视频在线观看| 国产成年精品| 婷婷成人综合| 蜜桃久久av一区| 国产调教精品| 精品美女在线视频| 99成人超碰| 午夜一级在线看亚洲| 日本中文字幕视频一区| 日韩精品一区二区三区中文在线 | 国产视频亚洲| 日本在线视频一区二区| 国产精品2023| 日韩欧美三级| 亚洲一区日本| 久久国产麻豆精品| 成人影视亚洲图片在线| 欧美在线观看视频一区| 免费高清在线一区| 国产日韩中文在线中文字幕| 成人国产精品一区二区免费麻豆| 成人看片网站| 在线日韩成人| 久久精品女人| 激情久久五月| 日韩av一区二区在线影视| 国产精品久久观看| 夜夜嗨网站十八久久| 国产精品久久久久77777丨| 97精品一区二区| 久久蜜桃精品| 丝袜国产日韩另类美女| 国产精品白浆| 天堂网av成人| 免费观看久久久4p| 久久久久伊人| 久久天堂av| 蜜臀av亚洲一区中文字幕| 欧美激情在线精品一区二区三区| 午夜精品久久久久久久久久蜜桃| 亚洲综合专区| 国产高潮在线| 亚洲在线久久| 中文字幕在线官网| 亚洲精品人人| 日本国产精品| 欧美另类中文字幕 | 国产一区二区三区亚洲| 亚洲深夜av| 都市激情国产精品| 五月激激激综合网色播| 日韩国产专区| 91亚洲无吗| 午夜影院欧美| 精品一区二区男人吃奶 | 成人在线免费观看网站| 蜜桃av一区二区在线观看| av高清不卡| 国产精品第一| 91精品国产调教在线观看| 午夜天堂精品久久久久| 亚洲综合在线电影|