<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 有哪些最新特性 ?

          共 3522字,需瀏覽 8分鐘

           ·

          2021-06-25 03:04

          Python 3.10 的開發(fā)已經(jīng)穩(wěn)定下來,我們終于可以測試最終版本中將包含的所有新功能。

          下面我們將介紹 Python 3.10 中最有趣的一些新增功能——結(jié)構(gòu)模式匹配、帶括號的上下文管理器、 更多類型以及新的報錯消息。

          結(jié)構(gòu)模式匹配

          結(jié)構(gòu)模式匹配是要添加到 Python 中的一個很棒的功能。想象一個如下所示的 if-else 語句(Python 3.9):

          1. http_code = "418"


          2. if http_code == "200":

          3. print("OK")

          4. elif http_code == "404":

          5. print("Not Found")

          6. elif http_code == "418":

          7. print("I'm a teapot")

          8. else:

          9. print("Code not found")

          輸出:
          1. I'm a teapot

          Python 3.10 中可以這樣寫:
          1. http_code = "418"


          2. match http_code:

          3. case"200":

          4. print("OK")

          5. case"404":

          6. print("Not Found")

          7. case"418":

          8. print("I'm a teapot")

          9. case _:

          10. print("Code not found")

          這就是新的 match-case語句——很酷,但目前還沒有什么特別之處。使 match-case語句如此有趣的原因是一種稱為結(jié)構(gòu)模式匹配的東西。結(jié)構(gòu)模式匹配允許我們執(zhí)行相同的 match-case 邏輯,但基于我們的比較對象的結(jié)構(gòu)是否與給定的模式匹配。
          因此,讓我們定義兩個字典,它們都具有不同的結(jié)構(gòu)。
          1. dict_a = {

          2. 'id': 1,

          3. 'meta': {

          4. 'source': 'abc',

          5. 'location': 'west'

          6. }

          7. }

          1. dict_b = {

          2. 'id': 2,

          3. 'source': 'def',

          4. 'location': 'west'

          5. }

          現(xiàn)在,我們可以編寫一個模式來匹配 dict_a,如下所示:
          1. {

          2. 'id': int,

          3. 'meta': {'source': str,

          4. 'location': str}

          5. }

          還有一個匹配 dict_b的模式:
          1. {

          2. 'id': int,

          3. 'source': str,

          4. 'location': str

          5. }

          如果我們將這兩個放在一個 match-case語句中,以及有效的 else/和包羅萬象的 case_ - 我們得到:
          1. # loop through both dictionaries and a 'test'

          2. for d in[dict_a, dict_b, 'test']:

          3. match d:

          4. case{'id': ident,

          5. 'meta': {'source': source,

          6. 'location': loc}}:

          7. print(ident, source, loc)

          8. case{'id': ident,

          9. 'source': source,

          10. 'location': loc}:

          11. print(ident, source, loc)

          12. case _:

          13. print('no match')

          輸出結(jié)果:
          1. 1 abc west

          2. 2def west

          3. no match

          是不是很酷?我已經(jīng)發(fā)現(xiàn)這對數(shù)據(jù)處理非常有用。
          帶括號的上下文管理器
          一個較小的變化是新的基于 PEG 的解析器。以前的 Python 解釋器有很多限制,這限制了 Python 開發(fā)人員可以使用的語法。
          Python 3.9 的基于 PEG 的解析器消除了這些障礙,從長遠來看,這可能會導致更優(yōu)雅的語法——這種變化的第一個例子是新的帶括號的上下文管理器。在 Python 3.9 之前,我們可以寫這樣的東西來打開兩個(或更多)文件 I/O 流:
          1. with open('file1.txt', 'r') as fin, open('file2.txt', 'w') as fout:

          2. fout.write(fin.read())

          第一行很長。但是由于解析器的限制,我們可以將此行拆分為多行的唯一方法是使用 \ 行繼續(xù)符:
          1. with open('file1.txt', 'r') as fin, \

          2. open('file2.txt', 'w') as fout:

          3. fout.write(fin.read())

          它是有效的,但不是很 Pythonic。使用新的解析器,我們現(xiàn)在可以將括號將這一行拆分為多行,如下所示:
          1. with(open('file1.txt', 'r') as fin,

          2. open('file2.txt', 'w') as fout):

          3. fout.write(fin.read())

          這種寫法很Pythonic。現(xiàn)在,在我們繼續(xù),如果我們寫:
          1. with(open('file1.txt', 'r') as fin,

          2. open('file2.txt', 'w') as fout):

          3. fout.write(fin.read())

          在 Python 3.9 中也可以這樣寫。這是因為新的解析器啟用了這種語法,盡管直到 Python 3.10 才被正式支持。
          Typing功能
          Python 的輸入功能也有更多更新。這里最有趣的添加是包含了一個新的運算符,它的行為類似于類型的 OR 邏輯,我們之前使用 Union 方法來實現(xiàn):
          1. from typing importUnion


          2. def add(x: Union[int, float], y: Union[int, float]):

          3. return x + y

          現(xiàn)在,我們不需要寫成 fromtypingimportUnion,并且 Union[int,float] 已經(jīng)簡化為 int|float,看起來更簡潔:
          1. def add(x: int| float, y: int| float):

          2. return x + y

          更加完善的報錯信息
          相信你第一次看到時都會去百度或者 Google 搜索:
          1. SyntaxError: unexpected EOF while parsing

          輸入 SyntaxError 時,Google 中排名第一的結(jié)果表明我們中的許多人確實在某個時候做過。

          這不是一條明確的報錯消息,Python 中充滿了不太明確的報錯消息。幸運的是,有人注意到了它們——其中許多消息都得到了顯著改善。

          官方更改列表中提到了更多改動 - 但在測試期間似乎沒有顯示,包括:
          1. from collections import namedtoplo

          2. > AttributeError: module'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?

          在這里, AttributeError 與之前相同,但增加了一個建議的屬性名稱—— namedtoplo 被標識為屬性 namedtuple的潛在拼寫錯誤。
          同樣,我們看到 NameError消息也有相同的改進:
          1. new_var = 5

          2. print(new_vr)


          3. > NameError: name 'new_vr'isnotdefined. Did you mean: new_var?

          總結(jié)
          以上是 Python 3.10 引入的一些關(guān)鍵新功能!
          完整版本預計于 2021 年 10 月 4 日發(fā)布,從現(xiàn)在開始,Python 開發(fā)人員將致力于改進已經(jīng)添加的內(nèi)容——但不會引入新功能。如果您想自己檢查一下,可以從這里下載 3.10.0b1。

          https://www.python.org/downloads/release/python-3100b1/

          Python貓技術(shù)交流群開放啦!群里既有國內(nèi)一二線大廠在職員工,也有國內(nèi)外高校在讀學生,既有十多年碼齡的編程老鳥,也有中小學剛剛?cè)腴T的新人,學習氛圍良好!想入群的同學,請在公號內(nèi)回復『交流群』,獲取貓哥的微信(謝絕廣告黨,非誠勿擾!)~


          還不過癮?試試它們




          提升 Python 性能 - Numba 與 Cython

          Python 是用 C 語言實現(xiàn)的,那 C 是用什么語言實現(xiàn)的?

          Python工匠:解析容器類型的門道

          Python 動態(tài)賦值的陷阱

          超詳細 Pycharm 部署項目視頻教程

          如何降低 Python 的內(nèi)存消耗量?


          如果你覺得本文有幫助
          請慷慨分享點贊,感謝啦
          瀏覽 46
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  军人妓女院BD高清片在线播放 | 一级免费黄色电影 | 国产三级小视频 | 蜜桃91视频 | 亚洲高清无码视频在线观看 |