Python 3.10發布臨近,一文盡覽所有重要新特性和變化

2021-12-26 OpenCV與AI深度學習

Python 3.10 的發布日益臨近,是時候來看看它將帶來的最重要的新特性和變化了。內容包括類型檢查,類型別名,switch/case語法,數量統計,上下文管理器,性能等。

作者:Martin Heinz
編譯:McGL

每年的這個時候,最新的 Python alpha 版本陸續發布(昨天剛發布了 alpha 第七版),第一個 beta 版即將推出(預計下個月3號),所以現在正是試用 Python 新版本的理想時機,看看 Python 3.10中有哪些酷炫的新功能即將推出!

安裝 Alpha/Beta 版

如果想嘗試最新和最好版本的 Python 的所有特性,你需要安裝 Alpha/Beta 版本。但是考慮到這個版本還不穩定,我們不希望用它覆蓋默認的 Python 安裝。所以要保留現有的解釋器同時安裝 Python 3.10,我們可以使用以下方法:

wget https://www.python.org/ftp/python/3.10.0/Python-3.10.0a7.tgz
tar xzvf Python-3.10.0a7.tgz
cd Python-3.10.0a7
./configure --prefix=$HOME/python-3.10.0a7
make
make install
$HOME/python-3.10.0a7/bin/python3.10

在運行上面的代碼之後,你會看到 Python 3.10 Alpha IDLE:

Python 3.10.0a7 (default, Apr 16 2021, 11:50:33) [GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

安裝了 Python 3.10 之後,我們來看看所有的新特性和變化.

類型檢查(Type Checking)改進

如果你在 Python 中使用過類型檢查,會很高興看到 Python 3.10 將包括很多類型檢查改進,包括語法更清晰的 類型 Union 運算符:

# Function that accepts either `int` or `float`
# Old:
def func(value: Union[int, float]) -> Union[int, float]:
    return value

# New:
def func(value: int | float) -> int | float:
    return value

除此之外,這個簡單的改進不僅限於類型注釋,還可以用於isinstance() 和 issubclass() 函數:

isinstance("hello", int | str)
# True

類型別名(Type Aliases)語法更改

在 Python 的早期版本中,增加了類型別名,以允許我們創建表示用戶定義類型的別名。在 Python 3.9 或更早的版本中,可以這樣寫:

FileName = str

def parse(file: FileName) -> None:
    ...

這裡 FileName 是基本 Python 字符串類型的別名。不過,從 Python 3.10開始,定義類型別名的語法將改為:

FileName: TypeAlias = str

def parse(file: FileName) -> None:
    ...

這個簡單的更改將使程式設計師和類型檢查器更容易區分普通變量賦值和類型別名。此更改也是向後兼容的,因此你不必更新任何使用類型別名的現有代碼。

除了這兩個變化之外,類型模塊還有其他改進 —— 即 PEP 612 中的參數規範變量(Parameter Specification Variables)。但是,這種代碼在大多數 Python 代碼庫中並不常見,因為它們用於將一個可調用(callable)的參數類型轉給另一個可調用的參數類型(例如在 decorator 中)。如果你有這樣的用例,請查看上面提到的 PEP。

數量統計(Population Count)

從 Python 3.10 開始,你可以使用 int.bit_count() 來計算整數的二進位表示形式的位計數(1的數量)。這也被稱為數量統計(Population Count/popcount):

value = 42
print(bin(value))
# '0b101010'
print(value.bit_count())
# 3

這當然很好,但是呢,其實實現這個函數一點都不難,只需一行代碼:

def bit_count(value):
    return bin(value).count("1")

儘管如此,這是又一個方便的函數,在某些時候可能會派上用場,而這些有用的小特性正是 Python 如此受歡迎的原因之一,似乎所有東西都是開箱即用的。

Distutils 被棄用(Deprecated)

在新版本中,不只是添加了一些新東西,而且還棄用/刪除了一些東西。這包括 distutils 包,該包在 3.10 中已被棄用,將在 3.12 中移除。這個包已經被 setuptools 和 packaging 替代一段時間了,所以如果你使用這兩個工具中的任何一個,那麼應該沒有問題。儘管如此,你還是應該檢查代碼中 distutils 的使用情況,並開始準備在不久的將來擺脫它。

上下文管理器(Context Manager)語法

Python 上下文管理器對於打開/關閉文件、處理資料庫連接和很多其他事情都非常有用,在 Python 3.10 中,它們的語法將有一點高質量的改進。這個改變允許帶圓括號的上下文管理器跨多行,如果你想用一個 with 語句創建多行,這是很方便的:

with (
    open("somefile.txt") as some_file,
    open("otherfile.txt") as other_file,
):
    ...

from contextlib import redirect_stdout

with (open("somefile.txt", "w") as some_file,
      redirect_stdout(some_file)):
    ...

從上面可以看到,我們甚至可以在緊接著的另一個上下文管理器中引用由上一個上下文管理器(... as some_file)創建的的變量!

這些只是 Python 3.10 中可用的很多新格式中的兩種。這個改進後的語法非常靈活,所以我不打算展示每一個可能的格式選項,因為我非常確定無論你將在 Python 3.10 中使用什麼,它都很可能能正常工作。

性能提升

正如最近發布的所有 Python 版本一樣,Python 3.10 也帶來了一些性能提升。首先是對 str()、 bytes() 和 bytearray() 構造函數的優化,它們的速度應該快 30% 左右(代碼段改編自 Python bug tracker 示例):

~ $ ./python3.10 -m pyperf timeit -q --compare-to=python "str()"
Mean +- std dev: [python] 81.9 ns +- 4.5 ns -> [python3.10] 60.0 ns +- 1.9 ns: 1.36x faster (-27%)
~ $ ./python3.10 -m pyperf timeit -q --compare-to=python "bytes()"
Mean +- std dev: [python] 85.1 ns +- 2.2 ns -> [python3.10] 60.2 ns +- 2.3 ns: 1.41x faster (-29%)
~ $ ./python3.10 -m pyperf timeit -q --compare-to=python "bytearray()"
Mean +- std dev: [python] 93.5 ns +- 2.1 ns -> [python3.10] 73.1 ns +- 1.8 ns: 1.28x faster (-22%)

另一個更值得注意的優化(如果你使用類型注釋)是函數參數及其注釋不再在運行時(runtime)計算,而是在編譯時計算。這使得創建一個帶有參數注釋的函數的速度提高了大約2倍。

除此之外,Python 核心的各個部分還有更多的優化。你可以在 Python bug tracker 的下列問題中找到更多的細節: bpo-41718、 bpo-42927 和 bpo-43452。

模式匹配(Pattern Matching)

你肯定已經聽說過的一個重要特性是結構模式匹配(Structural Pattern Matching)。我們都知道其他程式語言如何使用 switch/case 語句,但考慮到這是 Python,嗯,它不僅僅是簡單的 switch/case 語法,而且還添加了一些強大的功能,我們應該研究研究。

模式匹配最基本的形式是由 match 關鍵詞和表達式組成,然後根據接著的 case 語句中的模式測試得出結果:

def func(day):
    match day:
        case "Monday":
            return "Here we go again..."
        case "Friday":
            return "Happy Friday!"
        case "Saturday" | "Sunday":  # Multiple literals can be combined with `|`
            return "Yay, weekend!"
        case _:
            return "Just another day..."

在這個簡單的示例中,我們使用 day 變量作為表達式,然後將其與 case 語句中的單個字符串進行比較。除了字符串字面值的情況外,你還會注意到最後一種情況,它使用 _ 通配符,這相當於其他語言中存在的默認關鍵詞。不過,這個通配符可以省略,在這種情況下實際上返回 None。

在上面的代碼中需要注意的另一點是 | 的使用,這使得使用 | (或)操作符組合多個文本成為可能。

正如我所提到的,這個新的模式匹配並不只有基本的語法,而是帶來了一些額外的特性,比如複雜模式的匹配:

def func(person):  # person = (name, age, gender)
    match person:
        case (name, _, "male"):
            print(f"{name} is man.")
        case (name, _, "female"):
            print(f"{name} is woman.")
        case (name, age, gender):
            print(f"{name} is {age} old.")
        
func(("John", 25, "male"))
# John is man.

在上面的代碼段中,我們使用元組作為要匹配的表達式。然而這並不局限於元組,任何可迭代對象 iterable 都可以工作。另外,正如上面看到的,_ 通配符也可以在複雜模式中使用,而不僅僅是像前面的示例中那樣單獨使用。

使用純元組或列表可能並不總是最好的方法,所以如果你更喜歡使用類,那麼可以用下面的方法重寫:

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int
    gender: str
    
def func(person):  # person is instance of `Person` class
    match person:
        # This is not a constructor
        case Person(name, age, gender) if age < 18:  # guard for extra filtering
            print(f"{name} is a child.")
        case Person(name=name, age=_, gender="male"):  # Wildcard ("throwaway" variable) can be used
            print(f"{name} is man.")
        case Person(name=name, age=_, gender="female"):
            print(f"{name} is woman.")
        case Person(name, age, gender):  # Positional arguments work
            print(f"{name} is {age} years old.")

func(Person("Lucy", 30, "female"))
# Lucy is woman.
func(Person("Ben", 15, "male"))
# Ben is a child.

這裡我們可以使用類似類構造函數的模式來匹配類的屬性。當使用這種方法時,還可以將單個屬性捕獲到變量中(與前面展示的元組一樣),然後我們可以在各自的 case 主體中使用。

上面我們還可以看到模式匹配的一些其他特性,比如在第一個 case 語句中,它是一個嚮導,這是一個遵循模式的 if 條件。如果按值進行匹配還不夠,需要添加一些附加的條件檢查,那麼這種方法會很有用。再看看其他情況,我們還可以看到關鍵詞(例如 name = name)和位置參數都可以使用類似構造函數的語法,對於 _ 變量也是如此。

模式匹配還允許使用嵌套模式。這些嵌套模式可以使用任何可迭代對象,包括類似構造函數的對象或對象內更多的可迭代對象:

match users:
    case [Person(...)]:
        print("One user provided...")
    case [Person(...), Person(...) as second]:  # `as var` can be used to capture subpattern
        print(f"There's another user: {second}")
    case [Person(...), Person(...), *rest]:  # `*var` can be used as unpacking
        print(...)

這種複雜模式中,將子模式捕獲到變量中以便進行進一步處理可能非常有用。這可以通過使用 as 關鍵詞來完成,如上面第二個 case 所示。

最後,* 操作符可用於「解壓縮(unpack)」模式中的變量,_ 通配符也可以使用 *_ 模式。

如果你想看到更多的例子和完整的教程,請查看 PEP 636。

最後

Python 3.10 帶來了很多有趣的新特性,但這是 alpha 版(下個月即將發布 beta 版),還沒經過充分的測試。因此,現在就開始在生產中使用它絕對不是一個好主意。所以,最好坐等10月份的正式版發布,有空就刷刷 Python 3.10 新聞頁面。

話雖如此,用第一個 beta 版本(將在5月3號發布)進行測試運行,看看你現有的代碼庫是否與所有即將到來的更改、棄用或刪除的函數/模塊兼容,這當然是個未雨綢繆的好主意。

原文: https://towardsdatascience.com/all-the-important-features-and-changes-in-python-3-10-e3d1fe542fbf

更多視覺圖像處理相關內容,請長按關注:OpenCV與AI深度學習。

覺得有用,麻煩給個贊和在看  

相關焦點

  • Python3.10正式版發布! 竟有這些新特性!
    來源:juejin.cn/post/7015590447745613854Python 3.10正式發布,你嘗鮮了嗎?本文參考自 Python官方文檔 :Python Release Python 3.10.0 | Python.org[1]在正值國慶假期人山人海的2021年10月4號,Python官方正式發布了Python3.10.0[2]。作為一隻假期期間宅著不動的coding人,自然是第一時間體驗了一波。
  • Python 3.7 測試預覽版已經發布,添加新特性
    計劃於 2018-06-15 正式發布3.7.0。主要新功能1. PEP 538,將傳統的C語言環境強制轉換為基於UTF-8的語言環境2. PEP 539,CPython中線程本地存儲的新C-API3. PEP 540,UTF-8模式4. PEP 552,Deterministic pyc5.
  • Python3.6新特性官方文檔中文版
    中多出的新特性。另請參閱PEP 494 - Python 3.6 發布時間表摘要 - 發布亮點新的語法特性:PEP 498, 格式化字符串字面量PEP當用戶沒有指定版本(通過命令行參數或配置文件)時,py.exe啟動器以交互方式使用時,不再以Python 2優先於Python 3。 處理shebang行的方式保持不變 - 此處的「python」依舊指Python 2。python.exe和pythonw.exe已標記為長路徑敏感(long-path aware),這意味著260字符路徑限制可能不再適用。
  • Python3.6中那些很酷的特性
    離 python2 退休還有 702 天,Python3.7 也將在 6 月份發布正式版,你還記得 3.6 有哪些酷炫的特性嗎?來回顧一下。
  • Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!
    正文共:4946 字 1 圖預計閱讀時間:13 分鐘作者:陳祥安原文有刪改:https://docs.python.org/3.9/whatsnew/3.9.html本文將解釋 Python 3.9 中的新特性,而不是 3.8。有關完整的詳細信息,請參見更改日誌。
  • Python 3.8 新特性來襲
    總的來說,我們即將擁有一個更快、更精確、更一致和更現代的Python。下面是Python 3.8的新功能和最重要的改變。1.賦值表達式Python 3.8最明顯的變化就是賦值表達式,即:=操作符。賦值表達式可以將一個值賦給一個變量,即使變量不存在也可以。
  • Python 3.8.0 正式版發布,新特性初體驗
    10 月 15 日,Python 官方發布了 3.8.0 正式版,該版本較 3.7 版本再次帶來了多個非常實用的新特性。f-strings 支持等號在 Python 3.6 版本中增加了 f-strings,可以使用 f 前綴更方便地格式化字符串,同時還能進行計算,比如:>>> x = 10>>> print(f'{x+1}')11在 3.8 中只需要增加一個 = 符號,即可拼接運算表達式與結果
  • Python2 倒計時,還不快來掌握 Python3 酷炫的新特性?|原力計劃
    作者 | 雲爬蟲技術研究筆記責編 | 郭芮出品 | CSDN 博客Python3.8已經發布近一個月了,距離Python3.0第一個版本發布也將超過10年了。下面我們從幾個有趣的新特性入手,這些特性或方法都是 Python 3 各個版本中新加的,它們相比傳統的 Python 方法,更容易解決實踐中的一些問題。所有的示例都是在 Python 3.7 的環境下編寫的,每個特性示例都給出了其正常工作所需的最低的 Python 版本。
  • Python 官宣:正式發布 Python 3.8.0!
    新版本較3.7版增加了一大波新功能和優化,來與 AI 大咖一起參與討論吧~今天,Python 官網宣布,正式發布 Python 3.8.0!代表 Python 開發社區和 Python 3.8 發布團隊,我們很高興地宣布 Python 3.8.0 現在已經可以使用。Python 3.8.0 是 Python 語言的最新正式版,包含許多新功能和優化。
  • Python 3.10 都發布了,還需要 Ordered Dict 嗎?
    (參見前文《從一個面試題說開去:有了列表為什麼還要元組》)。例子 1 中,[("a", 1), ("b", 2)] 表示 2 個鍵值對,也可寫作 [["a", 1], ["b", 2]],這裡我們使用了元組表示每個鍵值對,具體原因可以參考前文(>>> 點擊這裡 <<<)例子 2 中,{"a": 1, "b": 2} 首先會創建字典,然後再傳遞給 OrderedDict,在 python3.6 之前結果可能會有不同
  • Python 3.8 即將到來,這是你需要關注的幾大新特性
    機器之心整理參與:一鳴、路Python 是一門廣受好評的程式語言,每個版本的更新都會對開發社區帶來一定影響。近日,Python 3.8 已進入 beta 2 版本的測試中,各項新特性已經添加完畢,最終版本預計於今年 10 月發布。
  • Python3.10發布,這個特性愛了愛了
    3.10正式版發布Python在幾天前發布了正式版3.10,雖然你不一定會馬上應用到生產環境,不過還是建議有條件的可以升級體驗以下,沒條件直接看我這篇文章就可以了,我列了幾個開發者可能比較感興趣的特性,看看哪個是你最期待的特性。
  • Python3.10第二個alpha版本!最新特性值得關注
    Python3.9 剛剛發布不久,Python3.10 的第二個 alpha 版本也已於 11 月初發布。透過這個版本,我們或許可以一窺 Python 的未來改變。Python3.10 第二個 alpha 版本的新功能包括以下三大部分:類型注釋擴展為什麼類型注釋很重要新方法和行為類型注釋擴展Python3.9
  • Python 2.7終結於7個月後,這是你需要了解的3.X炫酷新特性
    從 3.0 到 3.8,Python 3 已經更新了一波又一波,但似乎我們用起來和 2.7 沒有太大區別?以前該怎麼寫 2.7 的代碼現在就怎麼寫,只不過少數表達方式變了而已。在這篇文章中,作者介紹了 3.0 以來真正 Amazing 的新函數與新方法,也許這些方法我們都不太熟,但它們確實在實踐中非常重要。
  • WTF Python:有趣且鮮為人知的Python特性
    這個有趣的項目意在收集 Python 中那些難以理解和反人類直覺的例子以及鮮為人知的功能特性,並嘗試討論這些現象背後真正的原理!雖然下面的有些例子並不一定會讓你覺得 WTFs,但它們依然有可能會告訴你一些你所不知道的 Python 有趣特性。我覺得這是一種學習程式語言內部原理的好辦法,而且我相信你也會從中獲得樂趣!
  • 值得一試!Python 3中一些不常用但有效的特性
    此次版本升級中,最顯著的變化是將Python 2的print 函數替換為Python 3的print() 函數。要想讓括號符號在Python 2中運行,就需要在print關鍵字後打一個空格,這樣解釋器才將會將其識別為一個表達式。下面將介紹一小部分Python 3中獨有的超棒特性,希望能幫助你輕鬆解決在使用Python時遇到的問題。
  • 5 個越早知道越好的 Python 特性
    Kirill Sharkovski 發布在 Unsplash 雜誌上的照片雷鋒網AI開發者按,Python 是近十年來興起的程式語言,並且被證明是一種非常強大的語言。我用 Python 構建了很多應用程式,從交互式地圖到區塊鏈。Python 有很多特性,初學者很難一開始就掌握所有的特性。
  • Python 3.10重磅發布,這5個新特性愛了愛了!
    「ID: python_logic」嗨!大家好,我是酷頭歡迎來到學習python的寶藏基地~~~前兩天,Python官網發布了Python3.10.0。說實話,對於這次的升級,有幾個特性,還真是值得和大家講講。1.
  • Python3.10第二個alpha版本來了!最新特性值得關注
    Python3.9 剛剛發布不久,Python3.10 的第二個 alpha 版本也已於 11 月初發布。透過這個版本,我們或許可以一窺 Python 的未來改變。
  • Python2 倒計時,還不快來掌握 Python3 酷炫的新特性? | 原力計劃
    作者 | 雲爬蟲技術研究筆記責編 | 郭芮出品 | CSDN 博客Python3.8已經發布近一個月了,距離Python3.0第一個版本發布也將超過10年了。下面我們從幾個有趣的新特性入手,這些特性或方法都是 Python 3 各個版本中新加的,它們相比傳統的 Python 方法,更容易解決實踐中的一些問題。所有的示例都是在 Python 3.7 的環境下編寫的,每個特性示例都給出了其正常工作所需的最低的 Python 版本。