Python 3.8 即將到來,這是你需要關注的幾大新特性

2020-12-22 機器之心Pro

機器之心整理

參與:一鳴、路

Python 是一門廣受好評的程式語言,每個版本的更新都會對開發社區帶來一定影響。近日,Python 3.8 已進入 beta 2 版本的測試中,各項新特性已經添加完畢,最終版本預計於今年 10 月發布。在發布即將到來前,機器之心總結了 Python 3.8 中幾大值得關注的新功能和改進。

從事計算機領域工作的讀者朋友對 Python 程式語言應該非常熟悉了。這是一門廣受好評的動態程式語言,其靈活和語法簡易的特點使得這門語言在腳本工具、數據分析、Web 後端都有廣泛的應用。Python 開發社區也非常活躍,3.x 的版本迭代速度非常快。2018 年 6 月底,Python 3.7 問世,之後 Python 3.8 的開發和測試工作也已經展開。近日,Python 軟體基金會公開了 3.80b2 的說明文檔,向公眾展示了 beta 版本的測試進展,以及 Python 3.8 版本的新特性和功能改進。

目前,Python 3.8 的 beta 測試流程正在進行中。今年 6 月初,官方發布了第一個 beta 版本——Python 3.80b1,緊接著一個月後發布了 Python 3.80b2。第二個 beta 版本發布後,Python 3.8 新特性已經添加完畢。官方目前已公布最終版本的發布時間,預計在今年的 10 月份。

那麼,新的 Python 3.8 版本有哪些新特性和功能呢?機器之心根據 Python 基金會公開的文檔,整理出了以下值得期待的新特性和功能改進。

文檔地址:https://docs.python.org/zh-cn/3.8/whatsnew/3.8.html#summary-release-highlights

新的語法

Python 3.8 中最值得關注的部分在於其語法的變化,這些新語法有助於提升效率,減少代碼工作量。

海象運算符( := )

這個「:=」橫過來看是不是有點像海象的臉?這是一個新的 Python 語法,可以在進行條件判斷時直接為變量賦值。

過去我們需要首先對某個變量進行賦值,然後進行條件判斷。

m = re.match(p1, line)if m: return m.group(1)else: m = re.match(p2, line)if m: return m.group(2)else: m = re.match(p3, line) ...

而使用海象運算符後,我們可以直接為變量賦值:

if m := re.match(p1, line): return m.group(1)elif m := re.match(p2, line): return m.group(2)elif m := re.match(p3, line):

還有一個在循環中使用的例子,過去在對某個變量進行循環前必須首先賦值:

ent = obj.next_entry()while ent: ... # process ent ent = obj.next_entry()

現在可以一邊循環一邊賦值:

while ent := obj.next_entry(): ... # process ent

代碼調試中支持 f-string

f-string(或者稱為「格式化字符串」)在 Python 3.6 版本中加入的,雖然這一特性非常方便,但是開發者發現 f-string 對調試沒有幫助。因此,Eric V. Smith 為 f-string 添加了一些語法結構,使其能夠用於調試。

在過去,f-string 可以這樣使用:

print(f'foo={foo} bar={bar}')

在 Python 3.8 中,只需使用如下代碼(更加簡潔):

print(f'{foo=} {bar=}')

兩種情況下,輸出都是:

>>> foo = 42>>> bar = 'answer ...'>>> print(f'{foo=} {bar=}') foo=42 bar=answer ...

此外,可以通過在賦值符號後增加「!s」和「!f」命令,規定輸出結果的格式,例如:

>>> import datetime>>> now = datetime.datetime.now()>>> print(f'{now=} {now=!s}') now=datetime.datetime(2019, 7, 16, 16, 58, 0, 680222) now=2019-07-16 16:58:00.680222

>>> import math>>> print(f'{math.pi=!f:.2f}') math.pi=3.14

如代碼所示,第二個「now」變量的等號後增加了「!s」字符,使得 now 從「datetime」類型的輸出變成了字符串類型的輸出。在「pi」的輸出中,由於加入了「!f:.2f」,使得 pi 的輸出變為了保留小數點後兩位。

而花括號中的格式也會影響列印結果的格式,例如:

>>> a = 37>>> print(f'{a = }, {a = }') a = 37, a = 37

花括號中的等號前後間距不同,列印結果中的間距也不一樣。

不需要 Keyword 的變量輸入

這一語法使得函數在定義輸入變量時可以規定只能輸入 Value,而不在 Value 前加上 Keyword。

例如,在使用 pow() 函數時:

>>> pow(2, 3) 8>>> pow(x=2, y=3) ... TypeError: pow() takes no keyword arguments

第一種方法是合法的,但是第二種則非法。

為了保證第一種純粹的 Python 函數方法,開發者可以在定義函數時使用「/」規定哪些變量的輸入必須按照第一種格式。例如:

def pow(x, y, z=None, /): r = x**y if z is not None: r %= z return r

在定義了所有變量之後額外增加一個「/」字符,表示所有的 Python 變量輸入必須按照 pow(x, y, z) 的方式進行。

當然,也可以在變量之間插入「/」,正斜槓之前的變量按照純粹的 Python 輸入方法,而正斜槓之後的按照定義好的方法執行。例如,定義如下函數:

def fun(a, b, /, c, d, *, e, f): ...

則以下一些表達式合法的,但另一些非法:

fun(1, 2, 3, 4, e=5, f=6) # legalfun(1, 2, 3, d=4, e=5, f=6) # legalfun(a=1, b=2, c=3, d=4, e=5, f=6) # illegal

其他特性

除了一些語法方面的改進,Python 3.8 版本還有一些其他的變化。

可移動的「__pycache__」

__pycache__目錄是由 Python3 解釋器創建的,用於保存.pyc 文件。這些文件保存著解釋器編譯.py 文件之後的字節碼(byte code)。之前的 Python 版本僅僅只是為每個.py 文件創建一個.pyc 文件,但是新版本會有所變化。

為了支持多版本的 Python,包括一些不是 CPython 的版本(如 PyPy),現在庫文件會為每個 Python 版本創建對應的.pyc 文件,格式形如「name.interp-version.pyc」。例如,某個 foo.py 文件在第一次使用的時候會創建一個對應的 pyc 文件,其路徑為「__pycache__/foo.cpython-37.pyc」,這個 pyc 文件會定義使用的 Python 版本。

其他改進

Python 3.8 會為 C 語言擴展加入更快的調用方式,這種方式原本屬於 CPython。在 Python3.8 中,這一功能是實驗性的,最終的完成版本會出現在 Python3.9 中。

同時,編譯器中的初始化配置處理也得到了清理,使得 Python 可以更好地嵌入其他程序,不需要依賴環境變量或在已有的 Python 系統中增加導致衝突的其他組件。

此外,大量的 Python 自帶模塊得到了改進和調整,如「os.path」、「shutil」、「math」、「ssl」等。

Python 3.8 什麼時候與大家見面?

目前發布時間仍在探討,但考慮到 Python 3.9 的發布計劃(大約在 2020 年 6 月),官方認為 Python3.8 的發布時間不應當晚於今年 10 月份。

相關焦點

  • Python 2.7終結於7個月後,這是你需要了解的3.X炫酷新特性
    從 3.0 到 3.8,Python 3 已經更新了一波又一波,但似乎我們用起來和 2.7 沒有太大區別?以前該怎麼寫 2.7 的代碼現在就怎麼寫,只不過少數表達方式變了而已。在這篇文章中,作者介紹了 3.0 以來真正 Amazing 的新函數與新方法,也許這些方法我們都不太熟,但它們確實在實踐中非常重要。
  • Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!
    正文共:4946 字 1 圖預計閱讀時間:13 分鐘作者:陳祥安原文有刪改:https://docs.python.org/3.9/whatsnew/3.9.html本文將解釋 Python 3.9 中的新特性,而不是 3.8。有關完整的詳細信息,請參見更改日誌。
  • Python 3中一些不常用但有效的特性
    此次版本升級中,最顯著的變化是將Python 2的print 函數替換為Python 3的print() 函數。要想讓括號符號在Python 2中運行,就需要在print關鍵字後打一個空格,這樣解釋器才將會將其識別為一個表達式。下面將介紹一小部分Python 3中獨有的超棒特性,希望能幫助你輕鬆解決在使用Python時遇到的問題。
  • Python3.9來了,這十個新特性值得關注
    Python 3.9 已於 10 月 5 日發布,新版本的特性,你 get 到了嗎?對於 Python 程式設計師來說,這又是一個令人興奮的時刻。相比於之前的版本,Python 3.9 有哪些值得討論的功能呢?
  • Python 3.8 新特性來襲
    Python 3.8還引入了許多性能改進。總的來說,我們即將擁有一個更快、更精確、更一致和更現代的Python。下面是Python 3.8的新功能和最重要的改變。1.賦值表達式Python 3.8最明顯的變化就是賦值表達式,即:=操作符。
  • 這幾個常用的python庫你需要知道
    python可以說是近幾年最火熱、最實用的、最容易上手的工具之一了。功能強大、應用廣泛,可以幫你搜集工作數據,還能幫你下載音樂,電影,於是就掀起了一波學習python的大潮,小編也毫不猶豫的加入了。但是對於向小編一樣的小白來說,剛開始學習還是有些困難的,需要首先了解python的一些基礎知識。所以小編就整理了一些常用的python庫,希望對正在學習python的小夥伴有所幫助。1.MatplotlibMatplotlib是一個用於創建二維圖和圖形的底層庫。藉由它的幫助,你可以構建各種不同的圖標,從直方圖和散點圖到費笛卡爾坐標圖。
  • WTF Python:有趣且鮮為人知的Python特性
    這個有趣的項目意在收集 Python 中那些難以理解和反人類直覺的例子以及鮮為人知的功能特性,並嘗試討論這些現象背後真正的原理!雖然下面的有些例子並不一定會讓你覺得 WTFs,但它們依然有可能會告訴你一些你所不知道的 Python 有趣特性。我覺得這是一種學習程式語言內部原理的好辦法,而且我相信你也會從中獲得樂趣!
  • 從3個特性理解Python中的yield
    while True: du = yield "A"        print("du:", du)g = gen_AB() # 1print(next(g)) # 2print("關注我 -> 杜唯西") # 3 目的:用作分隔print(next(g)) # 4輸出
  • Python2 倒計時,還不快來掌握 Python3 酷炫的新特性?|原力計劃
    我們慢慢的向Python3.X去遷移,那我們如何能夠快速的掌握Python3.X版本的精髓呢?下面我們從幾個有趣的新特性入手,這些特性或方法都是 Python 3 各個版本中新加的,它們相比傳統的 Python 方法,更容易解決實踐中的一些問題。所有的示例都是在 Python 3.7 的環境下編寫的,每個特性示例都給出了其正常工作所需的最低的 Python 版本。
  • Python3.6中那些很酷的特性
    離 python2 退休還有 702 天,Python3.7 也將在 6 月份發布正式版,你還記得 3.6 有哪些酷炫的特性嗎?來回顧一下。
  • Python3.6新特性官方文檔中文版
    中多出的新特性。當用戶沒有指定版本(通過命令行參數或配置文件)時,py.exe啟動器以交互方式使用時,不再以Python 2優先於Python 3。 處理shebang行的方式保持不變 - 此處的「python」依舊指Python 2。python.exe和pythonw.exe已標記為長路徑敏感(long-path aware),這意味著260字符路徑限制可能不再適用。
  • 零基礎學python,你需要掌握這8個技巧!
    作為這幾年火爆的python,想要零基礎起步學習,興趣愛好是首要的,什麼語言都是入門簡單,精通難。相比java,c等語言來說python極其容易入門,但是簡單的語法也正是它的缺點,靈活導致很多bug在運行過程中才能發現,導致多人協同上很難保證統一的風格。
  • Python2 已終結,入手Python 3,你需要這30個技巧
    使用 Python3如果你關注 Python 的話,應該會知道 Python 2 已經於今年(2020 年)1 月 1 日正式棄用了。這份教程的很多例子都是只支持 Python 3 的,如果你還在用 Python 2.1,那也是時候與時俱進了。2.
  • 電腦程式設計語言Python 3.8.7安裝教程
    【安裝過程】:共計9步【軟體安裝包】:文末獲取【安裝難度】:⭐⭐1、準備好Python 3.8.7的安裝包,並解壓「5366python3.8.7」;2、打開解壓之後的「5366python3.8.7」文件夾,如果是你的計算機是
  • Java 15 即將到來,新特性速覽!
    這一功能在 JDK 14 和 JDK 13 中都已實現預覽版。它跨越多行原始碼,同時避免在常見情況下的轉義序列,從而簡化編寫 Java 程序的任務。文本塊是一個字符串文字,它避免了大多數轉義序列,以可預測的方式自動格式化字符串,並根據需要為開發人員提供了對該格式的控制權。文本塊建議的目標是提高 Java 程序中的字符串的可讀性,這些字符串表示以非 Java 語言編寫的代碼。
  • 5 個越早知道越好的 Python 特性
    Python 有很多特性,初學者很難一開始就掌握所有的特性。即使你是一個從其他語言(如 C 或 MATLAB)轉換過來的程式設計師,用更高抽象級別的 Python 編寫代碼絕對是另一種體驗。回顧起來,有很多 Python 特性如果我能早點知道,肯定能少走不少彎路。現在我想要重點介紹其中五個最重要的特性。
  • Python 3.9來了!這十個新特性值得關注
    Python 3.9 已於 10 月 5 日發布,新版本的特性,你 get 到了嗎?對於 Python 程式設計師來說,這又是一個令人興奮的時刻。 的新特性。 Python 3.9 提議將 LL(1) 替換為新的基於 PEG 的解析器,這意味著它將解除當前 LL(1) 語法對 Python 的限制。此外,當前的解析器修補了許多將要刪除的 hack。因此,從長遠來看,這會降低維護成本。 3.
  • Python3.6裡新特性,你竟然不知道!
    閱讀本文大概需要3分鐘Python3.6 不知道有多少同學用了,裡面推出了很多新的特性
  • Python帶我飛:50個有趣而又鮮為人知的Python特性
    資深Python 程式設計師可以嘗試挑戰,看是否能一次就找到例子的正確答案,也許能喚起你當年踩這些坑時的甜蜜回憶。Python, 是一個設計優美的解釋型高級語言, 它提供了很多能讓程式設計師感到舒適的功能特性。但有的時候, Python 的一些輸出結果對於初學者來說似乎並不是那麼一目了然。
  • 你需要知道的Python代碼規範性檢查(pylint和flake8)
    今天,就給大家介紹python中有兩個非常好用的代碼檢查工具-pylint和flake8。PylintPylint是一個Python代碼分析工具,它分析 Python 代碼中的錯誤,查找不符合代碼風格標準(Pylint 默認使用的代碼風格是 PEP 8)和有潛在問題的代碼。