Python 3.9 要來了?我還在3.6的路上!

公衆號關注 “菜鳥學Python

設爲 “星標”,帶你每天學Python!

Python 正在一直馬不停蹄地更新,歷時數月,我們迎來了又一個 Beta 版 —— 3.9.0b3,Python 3.9 正式版已經不遠了,一起來看它帶來了哪些值得開發者關注的重要新特性!

作者 | James Briggs

譯者 | 明明如月,責編 | 唐小引

Python 發佈了版本號爲 3.9.0b3 的 beta 版,後續即將發佈 Python 3.9 的正式版。該版本包含了一些令人興奮的新特性,預計正式版發佈以後這些特性能夠被大家廣泛使用。

本文主要介紹以下幾個方面:

  • 新增字典合併運算

  • 類型提示

  • 字符串新增的兩個方法

  • 新的 Python 解析器 —— 大讚!

接下來帶着大家瞭解一下這些特性以及它們的用法。

01 字典合併

這是我最喜歡的新特性,該特性的用法非常優雅。如果你想對兩個字典 a 和 b 進行合併,我們就可以使用合併操作。

合併的操作符爲 | :

a = {1: 'a', 2: 'b', 3: 'c'}
b = {4: 'd', 5: 'e'}
c = a | b
print(c)

輸出結果:

[Out]: {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}

還可以使用合併更新操作 |= ,該操作符可以更新原始字典的數據:

a = {1: 'a', 2: 'b', 3: 'c'}
b = {4: 'd', 5: 'e'}
a |= b
print(a)

[Out]: {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}

在執行合併運算時,如果字典包含相同的 key, 運算結果將採用第二個字典的鍵值對:

a = {1: 'a', 2: 'b', 3: 'c', 6: 'in both'}
b = {4: 'd', 5: 'e', 6: 'but different'}
print(a | b)

[Out]: {1: 'a', 2: 'b', 3: 'c', 6: 'but different', 4: 'd', 5: 'e'}

02 可迭代對象的字典更新

|=操作符另外一個非常棒的功能是使用一個可迭代對象(如列表或者生成器)的鍵值對更新字典:

a = {'a': 'one', 'b': 'two'}
b = ((i, i2) for i in range(3))
a |= b
print(a)

[Out]: {'a': 'one', 'b': 'two', 0: 0, 1: 1, 2: 4}

如果你用標準的合併操作符 | 替換上面的 |=操作符,由於 | 操作符只允許字典類型進行合併,所以將導致 TypeError。

03 類型提示

Python 是動態類型的編程語言,這就意味着我們不需要在代碼中指定數據類型。

雖然可以這麼做,但是這麼做有時候容易讓人困惑,此時靈活性就成爲了缺點。

從 3.5 版本開始,我們可以指定類型,但是仍然非常麻煩。這次對此進行了改進,大家看下面的這個例子:

左側沒有類型提示 vs 右側有類型提示

由於某個神祕的原因,我們想通過上圖所示的 add_int 函數,將相同的數字相加到一起。但是編輯器並不能很好地領會我們的意圖,由於兩個字符串也可以使用 + 進行連接所以並沒有給出警告。

現在我們可以指定函數的參數類型爲 int,編輯器就能夠立即識別出上述問題。

通過類型提示,我們還能看到非常具體的類型,例如:

任何地方都可以使用類型提示,由於有了新的語法支持,看起來清爽多了。

上圖我們將 sum_dict 函數的參數定義爲字典類型,將其返回值定義爲 int 類型。test 的定義時也指定了類型。

04 新增字符串函數

雖然字符串函數並沒有其他特性那麼“偉大”,由於非常實用,也值得在這裏一提。新版本中添加了移除前綴和後綴的兩個字符串函數:

"Hello world".removeprefix("He")

[Out]: "llo world"

Hello world".removesuffix("ld")

[Out]: "Hello wor"

05 新的解析器

開發者不容易察覺到新的語法解析器帶來的變化,但是它有可能成爲 Python 演變中的一個重要轉變。

Python 目前主要使用一種基於 LL (1)的語法,而這種語法可以通過 LL (1)解析器進行解析——該解析器從上到下、從左到右地解析代碼,只需要從詞法分析器中取出一個 token 就可以正確地解析下去。

我並不是非常清楚它的工作原理,但是我可以給出LL(1) 存在的一些問題:

  • Python 中包含非 LL(1) 語法,正因如此,當前語法採用了一些曲線救國的辦法,帶來了很多不必要的複雜性。

  • LL(1) 給 Python 語法造成了很多限制。某個相關話題 提到了下面代碼無法用當前的解析器進行解析(會造成 SyntaxError)。

with (open("a_really_long_foo") as foo,
      open("a_really_long_bar") as bar):
    pass
  • LL(1) 不能處理左遞歸。特定的遞歸語法意味着解析樹時可能出現無限循環。Python 的締造者 Guido van Rossum 在這篇文章[1]中給出瞭解釋。

這些因素以及更多我無法理解的其他因素影響着 Python 的發展,它們限制了語言的演進。

新的解析器基於 PEG, 它將給 Python 開發者提供更大的靈活性,從 Python 3.10 開始[2]我們將能夠感受到這一點。

上面講解了 Python 3.9 版本的幾個重要特性。如果你迫不及待地想體驗最新的 beta 版 3.9.0b3 ,可以在這裏[3]下載。

文章到此結束,感謝您的閱讀。

參考鏈接

[1]

       https://medium.com/@gvanrossum_83706/left-recursive-peg-grammars-65dab3c580e1

[2]

https://docs.python.org/3.9/whatsnew/3.9.html#pep-617-new-parser

[3]

https://www.python.org/downloads/release/python-390b3

原文:https://towardsdatascience.com/new-features-in-python39-2529765429fe

近期十大熱門:
我總結的80頁《菜鳥學Python精選乾貨.pdf》,都是乾貨

笑噴了,我用Python幫韋小寶選最佳老婆組合
用Python一鍵生成炫酷九宮格圖片,火了朋友圈

菜鳥也瘋狂!8分鐘用Python做一個酷炫的家庭隨手記

Github獲8300星!用Python開發的一個命令行的網易雲音樂

一道Python面試題,硬是沒憋出來,最後憋出一身汗!
Python高手進階|實戰4大併發祕籍

讓你縱橫 GitHub 的五大神器

值得收藏!8大技巧,帶你瞭解菜鳥和高手的區別!

臥槽!Pdf轉Word用Python輕鬆搞定!

由菜鳥學Python原班人馬打造的公衆號【程序員GitHub】,專注於分享GitHub上有趣的資源包括,Python,Java,Go語言前端學習等優質的學習資源,爆料程序員圈的新鮮趣事,熱門乾貨,職場感悟,感興趣的小夥伴可以來捧場!

點的“在看”,否則就看不到我了555
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章