<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          剛剛,Python 3.10 正式發(fā)布了!我發(fā)現(xiàn)了一個(gè)可怕的功能...

          共 3780字,需瀏覽 8分鐘

           ·

          2021-10-15 21:36

          首先,關(guān)于新版本說下對讀者的建議,初學(xué)者沒必要為了體驗(yàn)新功能去升級環(huán)境,極易出現(xiàn)問題!!!這是重點(diǎn)。對于本文提及內(nèi)容大家閱讀學(xué)習(xí)下即可,除非真的業(yè)務(wù)中需要,不然不要隨便搞系統(tǒng)環(huán)境!!!


          哪有人可能會問了,既然這樣,為什么還要分享這個(gè)內(nèi)容呢?因?yàn)楫吘故怯行掳姹荆懈聝?nèi)容,存在即有意義,對于學(xué)習(xí)者更應(yīng)該不斷吸納學(xué)習(xí)新的東西,這樣到需要的時(shí)候就能手到擒來了~接下來是正文:


          就在前幾天( 2021年10月4日) Python 終于正式發(fā)布了 3.10 版本,看了下這個(gè)版本的一些特性,最受關(guān)注的應(yīng)該就是 結(jié)構(gòu)模式匹配 了吧?也就是大家所熟悉的switch-case,寫錯(cuò)了不好意思,是 match-case。


          下邊是最簡單的一個(gè) match-case 的例子,看起來是不是非常的直觀簡潔?

          def?http_error(status):
          ????match?status:
          ????????case?400:
          ????????????print("Bad?request")
          ????????case?404:
          ????????????print("Not?found")
          ????????case?418:
          ????????????print("I'm?a?teapot")
          ????????case?_:
          ????????????print("Something's?wrong?with?the?internet")

          對這個(gè)功能滿懷期待的我,趕緊就下載升級了 3.10 的 Python 趕緊試用,可沒想到在我深入的體驗(yàn)過后,我從最開始的期待,變成了敬畏。

          敬畏,是因?yàn)檫@樣一個(gè)看似簡單的新功能,卻有著不少的學(xué)習(xí)成本,并且對 結(jié)構(gòu)模式匹配 半知半解的人來說,會增大代碼出錯(cuò)的概率,并不是大數(shù)人都能輕松駕馭的。

          我為什么會這么說呢?我會在文章最后來簡述我的觀點(diǎn)。

          鑒于大多數(shù)人,都沒有實(shí)際用過這種 結(jié)構(gòu)模式匹配,我會從 升級 3.10 開始教大家如何嘗鮮這個(gè)新功能,然后我會詳細(xì)的介紹 match-case 的使用方法。

          ?1. 升級 3.10 新版本

          我本機(jī)的電腦上目前的 Python 版本是 3.9.1 的

          $?/usr/local/bin/python3?--version
          Python?3.9.1

          由于這邊我使用的是 mac,因此我從官網(wǎng)上下載的是 Python 3.10 的 pkg 文件,如果是 win 的用戶,可以下載相應(yīng)的 msi 或者 exe 文件。

          下載鏈接我貼在下邊,可以直接訪問下載

          mac:?https://www.python.org/ftp/python/3.10.0/python-3.10.0-macos11.pkg
          win:?https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe

          我下載好安裝文件后,雙擊安裝,之后就雙擊下載的 pkg 文件,進(jìn)入安裝流程

          一路點(diǎn)擊繼續(xù),該同意的同意一下,出現(xiàn)如下提示表示安裝成功。

          再次在終端上確認(rèn)下是否升級成功

          ?2. or 模式的使用

          在上面我已經(jīng)貼出一個(gè) match-case 的最簡單示例,這邊就直接跳過簡單示例,來說說那些比較特殊的用法。

          在 Python 3.10 中其實(shí)有新增一個(gè) 聯(lián)合類型操作符 | ,但這個(gè)只能用于類型,具體的用法,我會在下一篇文章中做詳細(xì)的介紹,本篇文章還是集中于 match-case 的使用。

          在學(xué)習(xí)match-case 的時(shí)候,你會發(fā)現(xiàn),也有一個(gè)類似于聯(lián)合類型操作符的用法,但請你要注意區(qū)別,它并不是聯(lián)合類型操作,而是在 match-case 下獨(dú)有的 or模式操作符 | ,它可以將多個(gè)具體相同邏輯的 case 語句簡寫成同一個(gè)

          match?status:
          ????case?401?|?403?|?404:
          ????????print("Not?allowed")
          ????case?_:
          ????????print("Something's?wrong?with?the?internet")

          ?3. 通配符匹配任意對象

          match-case 的出現(xiàn)有利于提高代碼的可讀性,讓你的代碼更加優(yōu)雅,但同時(shí)要使用好它,也是有一些門檻的,特別是通配符的使用。

          下邊我舉一些例子來進(jìn)行講解

          在如下代碼中,使用了通配符 _ 和 可變參數(shù)中的 ?* 符號

          import?sys

          match?sys.argv[1:]:
          ????case?["quit"]:
          ????????print("exit")
          ????case?["create",?user]:?????#?創(chuàng)建單個(gè)用戶
          ????????print("create",?user)
          ????case?["create",?*users]:??#?批量創(chuàng)建多個(gè)用戶
          ????????for?user?in?users:
          ????????????print("create",?user)
          ????case?_:
          ????????print("Sorry,?I?couldn't?understand?the?argv")

          最后一個(gè) case 中的 _ 并不作為變量名,而表示一種特殊的模式,在前面的 case 中都未命中的情況下,該 case 會是最后的保障,能確保命中,它相當(dāng)于 Go 語言中的 default 分支。

          import?"fmt"

          func?main()?{
          ????education?:=?"本科"

          ????switch?education?{
          ????case?"博士":
          ????????fmt.Println("我是博士")
          ????case?"研究生":
          ????????fmt.Println("我是研究生")
          ????case?"本科":
          ????????fmt.Println("我是本科生")
          ????case?"大專":
          ????????fmt.Println("我是大專生")
          ????default:
          ????????fmt.Println("學(xué)歷未達(dá)標(biāo)..")
          ????}
          }

          ?4. 使用可變參數(shù) *args

          第二個(gè) case 和 第三個(gè) case 非常的像,區(qū)別在于第三個(gè) case中 users 前加了個(gè) *,他跟原 Python 函數(shù)中的可變參數(shù)是一個(gè)用法,會匹配列表的多個(gè)值。

          在該中表示可以從命令行參數(shù)中批量創(chuàng)建用戶。

          在 match-case 中相應(yīng)的 case 若有運(yùn)行到,對應(yīng)的變量是會被創(chuàng)建的。比如

          ?5. 使用可變參數(shù) **kv

          在如下代碼中,**rest 會匹配到所有的 args 中的 key 和 value

          ?6. 長度的匹配方式

          若你希望使用 case 僅對對象的長度做一些匹配,可以使用下面這樣的方式

          • [*_] 匹配任意長度的 list;

          • (, , *_) 匹配長度至少為 2 的 tuple

          ?7. 類對象的匹配

          對于類對象的匹配,下邊這個(gè)例子足夠簡單,不再講解。

          ?8. 匹配要注意順序

          在上邊基本介紹完了 match-case 的使用方法,如需更詳細(xì)的內(nèi)容,不如去通讀下 PEP?636(https://www.python.org/dev/peps/pep-0636/)?的內(nèi)容。

          在文章最開始的時(shí)候,我說過開發(fā)者應(yīng)該對這些新特性 心存敬畏,match-case 這樣一個(gè)看似簡單的新功能,卻有著不少的學(xué)習(xí)成本,如果對 結(jié)構(gòu)模式匹配 半知半解的人來說,可能會增大代碼出錯(cuò)的概率,并不是大數(shù)人都能輕松駕馭的。

          之所以會這么說,是因?yàn)?match-case 在面對不同的對象,它的匹配的規(guī)則也有所不同。

          • 當(dāng) match 的對象是一個(gè) list 或者 tuple 的時(shí)候,需要長度和元素值都能匹配,才能命中,這就是為什么下面這個(gè)例子走的是第三個(gè) case 而不是第二個(gè) case。


          • 當(dāng) match 的對象是一個(gè) dict 的時(shí)候,規(guī)則卻有所不同,只要 case 表達(dá)式中的 key 在所 match 的對象中有存在,即可命中。


          • 而當(dāng) match 的對象是類對象時(shí),匹配的規(guī)則是,跟 dict 有點(diǎn)類似,只要對象類型和對象的屬性有滿足 case 的條件,就能命中。

          因此在寫 match-case 的時(shí)候,最大的難點(diǎn)可能就是如何把握這個(gè)順序,才能確保你寫的代碼不會翻車。

          我個(gè)人總結(jié)一些規(guī)律,僅供大家參考:

          • list 或者 tuple:應(yīng)該從不格式到嚴(yán)格

          • dict 或者 object:應(yīng)該從嚴(yán)格到不嚴(yán)格

          在經(jīng)過半天時(shí)間的嘗鮮后,我有了一些自己的理解,分享給大家,不知道我的理解有沒有問題,但我依然建議大家在 充分了解 match-case 的匹配規(guī)則 后,再去使用它。

          文章點(diǎn)贊超過100+
          我將在個(gè)人視頻號直播(老表Max)
          帶大家一起進(jìn)行項(xiàng)目實(shí)戰(zhàn)復(fù)現(xiàn)
          贈送對應(yīng)圖書1本



          掃碼即可加我微信

          老表朋友圈經(jīng)常有贈書/紅包福利活動


          學(xué)習(xí)更多:
          整理了我開始分享學(xué)習(xí)筆記到現(xiàn)在超過250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲、機(jī)器學(xué)習(xí)等方面,別再說不知道該從哪開始,實(shí)戰(zhàn)哪里找了
          點(diǎn)贊”就是對博主最大的支持?
          瀏覽 35
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美海量操逼 | 亚洲乱72 | 特级艺体西西444WWw | 久久综合加勒比 | 影音先锋青青草视频 |