最新的 Python 功能

最新的 Python 功能

本文將說明 Python 的最新功能。

我們將從實用與「立即可用」的角度,逐步介紹 Python 3.12 到 3.13 版本時期值得關注的新功能。

YouTube Video

最新的 Python 功能

近年來,Python 不僅強調**「易於編寫」,同時也注重「健壯性、速度與可讀性」**等進化方向。以下將介紹 Python 3.12 到 3.13 這一代值得關注的功能。

錯誤訊息大幅改進(Python 3.12)

在 Python 3.12 中,錯誤訊息以更具體、視覺化的方式顯示。你可以立即判斷錯誤發生的位置,大幅減少除錯時間。

1def calc_total(price, tax):
2    return price + price * tax
3
4result = calc_total(100, )
  • 遺漏的參數會連同相關程式碼行與位置一同顯示,因此找出錯誤原因變得不易混淆。

「match」語句的實用應用(結構化模式匹配)

「match」語句讓你能以宣告式寫法描述複雜條件分支與資料結構判斷。對於字典與巢狀結構的處理,特別能提升可讀性。

1user = {"status": "active", "name": "Alice"}
2
3match user:
4    case {"status": "active", "name": name}:
5        print(f"Welcome back, {name}!")
6    case {"status": "inactive"}:
7        print("Please activate your account.")
8    case _:
9        print("Unknown user status.")
  • 由於能同時進行條件分支與資料擷取,因此無需多層巢狀 if 判斷。

以直觀的模式匹配處理巢狀資料

「match」語句對於處理 JSON 或 API 回應等結構化資料也很有效。

1data = {"user": {"name": "Bob", "age": 25}}
2
3match data:
4    case {"user": {"name": name, "age": age}}:
5        print(f"{name} is {age} years old.")
  • 你可以安全地擷取必要元素,減少防禦性程式碼的需求。

增強版 f-string 除錯輸出(=` 標記 / Python 3.8+,易用性提升)

透過 f-string,現在可以加上 =,同時顯示運算式本身與其評估結果。這項功能專為除錯設計,想快速檢查變數內容時非常方便。

1x = 10
2y = 20
3print(f"{x=}, {y=}, {x+y=}")
  • 由於會同時顯示變數名稱和其值,利用 print() 做臨時除錯時容易閱讀。
  • 你可以更簡潔且具表達力地撰寫日誌輸出與驗證程式碼。

簡化型別提示及「type」別名語法(Python 3.12:新型別別名語法)

在 Python 3.12 中,新增了專用型別別名語法——type 陳述式。這使得型別提示不只做為補充資訊,而能作為語言元素明確表達設計意圖

1type UserId = int
2type UserName = str
3
4def greet(user_id: UserId, name: UserName) -> str:
5    return f"Hello, {name} (id={user_id})"
  • 透過給予 UserIdUserName 等名稱,即使本質上同樣使用 intstr也能明確區分其角色差異
  • 型別定義變得更簡潔,降低程式碼審查與維護時的理解成本。
  • 以往像 UserId = int 這樣的型別別名是用指定建立,但改用 type 陳述式即可明確表達「這是型別定義」。在中大型專案中,這對提升設計可讀性特別有效。

自然使用內建型別註記(Python 3.9+:簡化泛型語法)

自 Python 3.9 起,可以直接將內建型別如 listdict 用作泛型

這使你無需從 typing 匯入型別,即可撰寫直覺且易讀的型別提示。

1def sum_numbers(numbers: list[int]) -> int:
2    return sum(numbers)
3
4print(sum_numbers([1, 2, 3, 4]))
  • 型別提示的用途並非「限制」,而是做為「說明處理內容的文件」。

使用 Self 型別安全實現方法鏈結(Python 3.11 以後)

自 Python 3.11 起,可將 Self 指定為返回自身類別的方法回傳型別。

這樣撰寫方法鏈結程式碼時,型別資訊不會遺失,更加安全。

 1from typing import Self
 2
 3class Counter:
 4    def __init__(self, value: int = 0) -> None:
 5        self.value = value
 6
 7    def increment(self) -> Self:
 8        self.value += 1
 9        return self
10
11counter = Counter()
12counter.increment().increment()
13print(counter.value)
  • 即使返回 self 的方法,也能正確保留回傳型別
  • IDE 及型別檢查工具能正確解析方法鏈結。

更明確的字串處理(removeprefixremovesuffix | Python 3.9+)

自 Python 3.9 起,新增了 str.removeprefix()str.removesuffix() 方法,能安全地移除字串的首碼與尾碼。利用這些方法,能精確表達僅移除字串開頭或結尾的意圖。

1filename = "report_2026.txt"
2
3clean_name = filename.removeprefix("report_")
4name_without_ext = clean_name.removesuffix(".txt")
5
6print(name_without_ext)
  • 只有當指定字串確實位於開頭或結尾時才會被移除,避免意外置換問題。
  • 這種方法比起 replace() 或切片,更具可讀性與安全性。
  • 特別是在處理「有格式的字串」如檔名、URL 前置時,使用這些方法大幅降低產生 bug 的風險

國際化下的穩健字串比對(str.casefold() | Unicode 支援)

str.casefold() 是 Python 中考慮 Unicode 標準的大小寫不敏感比對方法。與單純的 lower()upper() 不同,它還會包含語言特定的字符轉換進行正規化。

1text1 = "Stra\u00dfe"
2text2 = "strasse"
3
4print(text1)
5print(text2)
6
7print(f"Comparison Result: {text1.casefold() == text2.casefold()}")
  • 可以正確處理語言相關差異,例如德文的 ßss
  • 這是多語系支援或國際化應用程式的重要技術。

標準 TOML 支援(tomllib | Python 3.11+)

自 Python 3.11 起,標準函式庫新增 tomllib 模組用於讀取 TOML 設定檔。設定檔管理現可完全以 Python 完成,無需依賴外部函式庫。

 1import tomllib
 2
 3with open("config.toml", "rb") as f:
 4    config = tomllib.load(f)
 5
 6print(config["database"]["host"])
 7
 8# config.toml
 9# title = "TOML Example"
10# [database]
11# host = "192.168.1.1"
12# ports = [ 8001, 8001, 8002 ]
  • 不再需要像 toml 這類外部套件,令相依關係更簡潔。
  • 設定檔載入流程標準化,便於部署、運維及 CI 環境管理。

並行時代的異常處理(ExceptionGroup / except* | Python 3.11+)

Python 3.11 引入了**ExceptionGroup 用於同時處理多個異常**,與分支處理專用的 except* 語法。專為非同步或平行處理中「同時出現多個錯誤」的情境設計的新功能。

 1def process(values):
 2    errors = []
 3    for v in values:
 4        if v < 0:
 5            errors.append(ValueError(f"Negative value: {v}"))
 6    if errors:
 7        raise ExceptionGroup("Invalid values", errors)
 8
 9try:
10    process([1, -2, -3])
11except* ValueError as e:
12    print("Handled:", e)
  • 現可一次觸發與分類多個異常
  • 解決了以往非同步處理僅能捕獲第一個錯誤的困擾。
  • 例如 asyncio.gather() 或並行批次處理時,可能同時出現多種失敗原因。運用 ExceptionGroup 更有利於組織錯誤彙總、日誌記錄與重試策略

僅需升級到最新版即可提升效能

自 Python 3.11 起,許多處理流程由於內部最佳化明顯加快。

1def count_up(n):
2    total = 0
3    for i in range(n):
4        total += i
5    return total
6
7print(count_up(1_000_000))
  • 最大優點是:無需更動程式碼也能享受速度提升

管理垃圾回收(透過 gc 模組顯式操作)

在 Python 中,使用標準的 gc 模組 即可暫時停用或手動執行垃圾回收。在大量資料批次處理、效能關鍵場景下屬於有效的最佳化技巧。

1import gc
2
3gc.disable()
4# heavy batch processing
5gc.enable()
6gc.collect()
  • 抑制不必要的垃圾回收可減少處理時間波動
  • 你可在流程間隔時顯式進行回收,使記憶體使用更易追蹤。
  • 然而,此方法不建議做為預設最佳化,僅當分析結果顯示垃圾回收為瓶頸時才宜考慮。對大多數應用而言,依賴 Python 的自動垃圾回收最為安全。

總結

隨著 Python 3.12 至 3.13 版本錯誤訊息的改進及型別提示的進化,理解與維護程式碼比以往更加容易。此外,像更好的除錯體驗與內部優化帶來的效能提升,已在實務上穩步提升生產力。你無需一次採用全部新功能,實務上建議先升級到最新 Python 版本,視需求逐步導入。這樣逐步採用的方式能帶來更具可讀性與健壯性的 Python 程式碼。

您可以在我們的 YouTube 頻道上使用 Visual Studio Code 來跟隨上述文章一起學習。 請也查看我們的 YouTube 頻道。

YouTube Video