1. 程式人生 > 程式設計 >Python 3.8 新功能來一波(大部分人都不知道)

Python 3.8 新功能來一波(大部分人都不知道)

Python 3.8 新功能來一波(大部分人都不知道)

Python 是一門廣受好評的程式語言,每個版本的更新都會對開發社群帶來一定影響。近日,Python 3.8 已進入 beta 2 版本的測試中,各項新特性已經新增完畢,最終版本預計於今年 10 月釋出。

從事計算機領域工作的讀者朋友對 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 月份。

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

正文

Python 3.8 是Python語言的最新版本,它適合用於編寫指令碼、自動化以及機器學習和Web開發等各種任務。

現在Python 3.8已經進入官方的beta階段,這個版本帶來了許多語法改變、記憶體共享、更有效的序列化和反序列化、改進的字典和更多新功能。

Python 3.8還引入了許多效能改進。總的來說,我們即將擁有一個更快、更精確、更一致和更現代的Python。

下面是Python 3.8的新功能和最重要的改變,我總結了一些開發中用得到的,常用的特性。

1.賦值表示式

Python 3.8最明顯的變化就是賦值表示式,即:=操作符。賦值表示式可以將一個值賦給一個變數,即使變數不存在也可以。它可以用在表示式中,無需作為單獨的語句出現。

Python 3.8 新功能來一波(大部分人都不知道)

上例中,如果變數line不存在則會被建立,然後將file.readline()的返回值賦給它。然後檢查line是否為"end"。如果不是,則讀取下一行,儲存在line中,然後繼續測試。

賦值表示式遵循了Python一貫簡潔的傳統,就像列表解析式一樣。其目的在於避免在特定的Python程式設計模式中出現一些枯燥的樣板程式碼。例如,上述程式碼用一般寫法需要多寫兩行程式碼。

2.僅通過位置指定的引數

僅通過位置指定的引數是函式定義中的一個新語法,可以讓程式設計師強迫某個引數只能通過位置來指定。這樣可以解決Python函式定義中哪個引數是位置引數、哪個引數是關鍵字引數的模糊性。

僅通過位置指定的引數可以用於如下情況:某個函式接受任意關鍵字引數,但也能接受一個或多個未知引數。Python的內建函式通常都是這種情況,所以允許程式設計師這樣做,能增強Python語言的一致性。

Python文件中給出的例子如下:

Python 3.8 新功能來一波(大部分人都不知道)

符號 / 分隔了位置引數和關鍵字引數。在這個例子中,所有引數都是未知引數。在以前版本的Python中,z會被認為是關鍵字引數。但採用上述函式定義,pow(2,10)和pow(2,10,5)都是正確的呼叫方式,而pow(2,z=5)是不正確的。

3.支援f字串除錯

f字串格式可以更方便地在同一個表示式內進行輸出文字和值或變數的計算,而且效率更高。

Python 3.8 新功能來一波(大部分人都不知道)

輸出4。

在f字串表示式末未新增=可以輸出f表示式本身的值,後面是計算後的值

Python 3.8 新功能來一波(大部分人都不知道)

輸出為x+1=4。

4.多程序共享記憶體

在Python 3.8中,multiprocessing模組提供了SharedMemory類,可以在不同的Python進城之間建立共享的記憶體區域。

在舊版本的Python中,程序間共享資料只能通過寫入檔案、通過網路套接字傳送,或採用Python的pickle模組進行序列化等方式。共享記憶體提供了程序間傳遞資料的更快的方式,從而使得Python的多處理器和多核心程式設計更有效率。

共享記憶體片段可以作為單純的位元組區域來分配,也可以作為不可修改的類似於列表的物件來分配,其中能儲存數字型別、字串、位元組物件、None物件等一小部分Python物件。

5.Typing模組的改進

Python是動態型別語言,但可以通過typing模組新增型別提示,以便第三方工具驗證Python程式碼。Python 3.8給typing添加了一些新元素,因此它能夠支援更健壯的檢查:

final修飾器和Final型別標註表明,被修飾或被標註的物件在任何時候都不應該被重寫、繼承,也不能被重新賦值。

Literal型別將表示式限定為特定的值或值的列表(不一定是同一個型別的值)。

TypedDict可以用來建立字典,其特定鍵的值被限制在一個或多個型別上。注意這些限制僅用於編譯時確定值的合法性,而不能在執行時進行限制。

6.新版本的pickle協議

Python的pickle模組提供了一種序列化和反序列化Python資料結構或例項的方法,可以將字典原樣儲存下來供以後讀取。不同版本的Python支援的pickle協議不同,而最新版本的支援範圍更廣、更強大、更有效的序列化。

Python 3.8引入的第5版pickle協議可以用一種新方法pickle物件,它能支援Python的緩衝區協議,如bytes、memoryviews或Numpy array等。新的pickle避免了許多在pickle這些物件時的記憶體複製操作。

NumPy、Apache Arrow等外部庫在各自的Python繫結中支援新的pickle協議。新的pickle也可以作為Python 3.6和3.7的外掛使用,可以從PyPI上安裝。

7.可反轉字典

Python3.6中重寫了字典,其使用了PyPy專案貢獻的一個新實現。除了更快、更緊湊之外,現在的字典還會繼承元素的順序——元素會按照新增的順序排列,就像列表一樣。Python 3.8還允許在字典上使用reversed()。

8.效能改進

許多內建方法和函式的速度都提高了20%~50%,因為之前許多函式都需要進行不必要的引數轉換。

一個新的opcode快取可以提高直譯器中特定指令的速度。但是,目前實現了速度改進的只有LOAD_GLOBAL opcode,其速度提高了40%。以後的版本中也會進行類似的優化。

檔案複製操作如shutil.copyfile()和shutil.copytree()現在使用平臺特定的呼叫和其他優化措施,來提高操作速度。

新建立的列表現在平均比以前小了12%,這要歸功於列表建構函式如果能提前知道列表長度的情況下進行的優化。

Python 3.8中向新型類(如class A(object))的類變數中的寫入操作變得更快。operator.itemgetter()和collections.namedtuple()也得到了速度優化。

9.Python C API和CPython實現

Python最近的版本在CPython(C語言編寫的Python的參考實現)中使用的C API重構方面下了很大功夫。到目前為止這些工作還在不斷新增,現有的成果包括:

Python初始化配置(Python Initialization Configuration)有了個新的C API,可以實現對Python初始化例程更緊密的控制和更詳細的反饋。如此一來,將Python執行時嵌入到其他應用程式中就會更容易,也可以以程式設計方式給Python程式傳遞啟動引數。新的API還確保了所有Python配置控制都有一個單一的、一致的位置,因此以後的改變(如Python的新的UTF-8模式)也更為容易。

CPython的另一個新的C API——"vectorcall"呼叫協議——可以實現針對Python內部方法更快的呼叫,而無需建立臨時物件。該API依然不穩定,但已有了明顯的改善。該API計劃在Python 3.9中成熟。

Python執行時的審計鉤子為Python執行時提供了兩個API,可以用來勾住事件,從而保證測試框架、日誌和審計系統等外部工具能夠監視到它們。

10.如何下載Python 3.8

從Python 軟體基金會下載Python 3.8 beta版:https://www.python.org/downloads/release/python-380b1/

到此這篇關於Python 3.8 新功能來一波(大部分人都不知道)的文章就介紹到這了,更多相關Python 3.8 新功能內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!