您应该知道Python 3.10中的新特性!
Hello,大家好,我是Alex,歡迎來到每周博客!
這篇博客來給大家介紹一下Python 3.10的新特性。
Python 3.10版本帶來了一些很棒的新功能和改進。
結構模式匹配
結構模式匹配可以讓我們將變量與一組不同的可能值進行匹配,就類似于其它編程語言中的switch case語句,相應的Python 3.10中為match case語句。
一個簡單的示例:
import randomdef http_error(status) -> str:match status:case 400:return "Bad Request"case 401 | 403: # 可以將多個可能值組合在一個casereturn "Not Allowed"case 404:return "Not Found"case _:return "Something's wrong with the internet"if __name__ == '__main__':s = random.choice([400, 401, 403, 404, 500])print(s, http_error(s))s = random.choice([400, 401, 403, 404, 500])print(s, http_error(s))輸出:
D:\Python\Python310\python.exe E:/Code/PythonProject/Python310NewFeatures/main.py 403 Not Allowed 500 Something's wrong with the internetProcess finished with exit code 0Python 3.10不僅支持與簡單值進行匹配,還可以與其它數據類型進行匹配,比如元組或者設置為特定值的特定屬性的類對象。
point = (3, 4) match point:case (0, 0):print("Origin")case (0, y):print(f"x = 0, y = {y}")case (x, 0):print(f"x = {x}, y = 0")case (x, y):print(f"x = {x}, y = {y}")case _:raise ValueError("Not a Point")輸出:
D:\Python\Python310\python.exe E:/Code/PythonProject/Python310NewFeatures/main.py x = 3, y = 4Process finished with exit code 0我們可以看到match case在許多不同的場景中都可以使用。
帶括號的上下文管理器
現在已支持使用外層圓括號來使多個上下文管理器可以連續多行地書寫。 這允許將過長的上下文管理器集能夠以與之前 import 語句類似的方式格式化為多行的形式。 例如,以下這些示例寫法現在都是有效的:
with (CtxManager() as example):...with (CtxManager1(), # 在被包含的分組末尾過可以使用一個逗號作為結束:CtxManager2() ):...with (CtxManager1() as example,CtxManager2()):...with (CtxManager1(),CtxManager2() as example):...with (CtxManager1() as example1,CtxManager2() as example2 ):...zip函數的strict參數
現在 zip() 函數有一個可選的 strict 布爾參數,用于要求所有可迭代對象的長度都相等。
zip() 函數創建一個迭代器聚合來自多個可迭代項的元素,默認是當到達較短的可迭代對象的末尾時停止。
names = ["Max", "Mary", "Ben"] ages = [22, 26]result = zip(names, ages) print(list(result))輸出:
[('Max', 22), ('Mary', 26)]它只是組合了前兩個元素,丟棄了第三個name。
如果設置strict參數為True,那么可迭代對象長度不等時將引發報錯。
>>> names = ["Max", "Mary", "Ben"] >>> ages = [22, 26] >>> >>> result = zip(names, ages, strict=True) >>> print(list(result)) Traceback (most recent call last):File "<stdin>", line 1, in <module> ValueError: zip() argument 2 is shorter than argument 1更清楚的錯誤消息
這是我發現的非常有用的另一項改進,許多錯誤消息已經得到了改進,不僅提供有關錯誤的更精確消息,而且還提供有關錯誤實際發生位置的更精確信息。
例如在此代碼中缺少括號,舊錯誤只是一條invalid syntax,甚至連行號都不對。
Python 3.7.0 (default, Jun 28 2018, 08:04:48) [MSC v.1912 64 bit (AMD64)] :: Anaconda, Inc. on win32 Type "help", "copyright", "credits" or "license" for more information. >>> print("Hello" ... print("World")File "<stdin>", line 2print("World")^ SyntaxError: invalid syntax而在Python 3.10中我們可以看到它正確的報錯行號和錯誤描述。
Python 3.10.0 (tags/v3.10.0:b494f59, Oct 4 2021, 19:00:18) [MSC v.1929 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> Print("Hello" ... Print("World")File "<stdin>", line 1Print("Hello"^^^^^^ SyntaxError: invalid syntax. Perhaps you forgot a comma?還有縮進錯誤的例子,我們也可以看到錯誤確切的行和位置以及準確的錯誤信息。
>>> def foo(): ... if lel: ... x = 2File "<stdin>", line 3x = 2^ IndentationError: expected an indented block after 'if' statement in line 2我非常喜歡這個改進,這對初學者特別有幫助。
更新和棄用
- Python 3.10現在需要OpenSSL 1.1.1 or newer,這會影響hashlib、hmac和ssl模塊的運行。
- distutils包已被廢棄,將在 Python 3.12 中移除。其用指定包構建程序的功能已被第三方軟件包 setuptools 和 packaging 完全取代。
優化
- 現在,構造函數 str() 、 bytes() 和 bytearray() 速度更快了(小對象大約提速 30-40%)。
- runpy 導入的模塊變少了。python3 -m module-name 命令的啟動時間平均加快 1.4 倍。在 Linux 上,Python 3.9 的 python3 -I -m module-name 導入了69個模塊,而 Python 3.10 只導入了 51個模塊(少了 18 個)。
- 當用 --enable-optimizations 構建 Python 時,會在編譯和鏈接命令行中添加 -fno-semantic-interposition。 這會讓用帶參數 --enable-shared 的 gcc 構建 Python 解釋器時提速 30%。
- 子串搜索函數,如 str1 in str2 和 str2.find(str1) ,有時會采用Crochemore & Perrin的“二路歸并”字符串搜索算法,以避免長字符串的二次檢索行為。
總結
Python 3.10帶來了很多很棒的功能改進和性能優化,我覺得最有趣的就是模式匹配功能,最有用的就是更清楚的錯誤消息,詳細的Python 3.10 有什么新變化可以參考官方文檔。
總結
以上是生活随笔為你收集整理的您应该知道Python 3.10中的新特性!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ❤️时间管理大师!我是如何规划自己的时间
- 下一篇: Selenium Xpath元素无法定位