重磅!Python3.10正式版發布! 竟有這些新特性!

2022-01-01 Python進擊者

來源:juejin.cn/post/7015590447745613854

Python 3.10正式發布,你嘗鮮了嗎?

本文參考自 Python官方文檔 :Python Release Python 3.10.0 | Python.org[1]

在正值國慶假期人山人海的2021年10月4號,Python官方正式發布了Python3.10.0[2]。作為一隻假期期間宅著不動的coding人,自然是第一時間體驗了一波。相較於之前的版本,該版本有以下主要變更。

新的 Union Type表達

新版本簡化了 Union Type 的使用 ,改為更為簡潔的|

舊版:

from typing import Union
a: Union[int, str] = 1

新的版本:

a: str | int = 1

二者完全等價:

Union[int, str] == int | str # True

這類變化在其他地方也相似:

# 舊版:
# def f(list: List[Union[int, str]], param: Optional[int]) -> Union[float, str]
def f(list: List[int | str], param: int | None) -> float | str:
    pass

f([1, "abc"], None)

# 舊版: 
# typing.List[typing.Union[str, int]]
typing.List[str | int]
list[str | int]

# 舊版: 
# typing.Dict[str, typing.Union[int, float]]
typing.Dict[str, int | float]
dict[str, int | float]

該特性也可用於 isinstance和issubclass

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

# True 
issubclass(str, str|int)

zip 可選嚴格模式

zip新增可選參數strict, 當該選項為True時,傳入zip的兩個可迭代項長度必須相等,否則將拋出 ValueError

舊版(及不加此參數),當二者長度不等時,以長度較小的為準

names = ["a","b","c","d"]
numbers = [1,2,3]
z = zip(names,numbers)
for each in z:
    print(each)
    
# ('a', 1)
# ('b', 2)
# ('c', 3)

設置strict為True

# ...
z = zip(names,numbers,strict=True)
# ...

d:\projects\python\learn\Py310探索.py in <module>
      3 numbers = [1,2,3]
      4 z = zip(names,numbers,strict=True)
----> 5 for each in z:
      6     print(each)

ValueError: zip() argument 2 is shorter than argument 1

帶括號的上下文管理器

with可以加括號了

with (CtxManager() as example):
    ...

with (
    CtxManager1(),
    CtxManager2()
):
    ...

with (CtxManager1() as example,
      CtxManager2()):
    ...

with (CtxManager1(),
      CtxManager2() as example):
    ...

with (
    CtxManager1() as example1,
    CtxManager2() as example2
):
    ...

import pathlib
p = pathlib.Path()
p1 = p/"text1.txt" # 內容:文本1的內容
p2 = p/"text2.txt" # 內容:文本2的內容
with(
    p1.open(encoding="utf-8") as f1,
    p2.open(encoding="utf-8") as f2
):
    print(f1.read(), f2.read(), sep="\n") 
    
    # 文本1的內容
 # 文本2的內容

顯式類型別名

使用 TypeAlias 顯式標註類型別名,提高可讀性

舊的方式:

x = int
def plus_int(a:x,b:x) -> x:
    return a+b

可以看到,x很容易被搞混

新的方式:使用 TypeAlias表明這是個別名

from typing import TypeAlias
x : TypeAlias = int
def plus_int(a:x,b:x) -> x:
    return a+b

match...case語句

對,就是其他語言的switch-case,python終於提供了支持,還是加強版的

完整語法參見:PEP 634 -- Structural Pattern Matching: Specification | Python.org[3]

舉幾個例子:

基本的類型匹配:

day = 6
match day:
    case 1:
        print("星期一")
    case 6 | 7:
        print("周末")
    case _ : 
        print("其他情況")

subject:這在處理命令行參數的時候特別有用

"""
    @copyright : [FunnySaltyFish](https://funnysaltyfish.github.io)
    @date : 2021/10/05 21:08:42
"""
command = "save 1.txt"
# 試著把command改成 list / copy 1.txt 2.txt 看看效果
match command.split(" "):
    case ["list"]:
        print("列出文件~")
    case ["save", file_name]:
        print(f"保存文件到 {file_name}")
    case ["copy",source,target]:
        print(f"拷貝 {source} -> {target}")

也可以匹配對象:

class Person():
    pass

class Student(Person):
    def __init__(self, id: int) -> None:
        self.id = id

class Teacher(Person):
    def __init__(self, name: str) -> None:
        self.name = name

a = Student(1)
# a = Student(2)
# a = Teacher("FunnySaltyFish")
match a:
    case Student(id = 2):
        print(f"這是位學生,且id正好是2")
    case Student():
        print(f"這是學生,id為{a.id}")
    case Teacher():
        print(f"這是老師, 姓名為{a.name}")

當然也可以匹配字典:

d = {
    "name" : "李四", # 張三
    "age" : 18,
    "hobby" : "閱讀"

match d:
    case {"name":"張三", **args}:
        # **收集其他參數
        print("這是張三", args) # 這是張三 {'age': 18, 'hobby': '閱讀'}
    case {"name" : name , "age" : age, "hobby": hobby}:
        print(f"我叫{name}, 今年{age}歲, 喜歡{hobby}") #我叫李四,今年18歲,喜歡閱讀

更複雜的還有結合Guard、匹配捕獲等使用,具體可以參見:PEP 635 -- Structural Pattern Matching: Motivation and Rationale | Python.org[4] 和 PEP 636 -- Structural Pattern Matching: Tutorial | Python.org[5]

更友好的報錯提示

現在,當你的括號、引號未閉合時,python會拋出更加清晰明了的錯誤

str = "未閉合的str

File "d:\projects\python\learn\Py310探索.py", line 90
    str = "未閉合的str
          ^
SyntaxError: unterminated string literal (detected at line 90)

 arr = [1, 2, 2, 3
    
  File "d:\projects\python\learn\Py310探索.py", line 91
    arr = [1, 2, 2, 3
          ^
SyntaxError: '[' was never closed

其他一些更新:distutils 被棄用

推薦使用 setuptools

需要 OpenSSL 1.1.1 及以上版本移除 Py_UNICODE編碼APIPyUnicodeObject的wstr被棄用,並將在之後移除

完。摸魚去了。

參考資料[1]

https://www.python.org/downloads/release/python-3100/: https://link.juejin.cn?target=https%3A%2F%2Fwww.python.org%2Fdownloads%2Frelease%2Fpython-3100%2F

[2]

https://www.python.org/downloads/release/python-3100/: https://link.juejin.cn?target=https%3A%2F%2Fwww.python.org%2Fdownloads%2Frelease%2Fpython-3100%2F

[3]

https://www.python.org/dev/peps/pep-0634/#id25: https://link.juejin.cn?target=https%3A%2F%2Fwww.python.org%2Fdev%2Fpeps%2Fpep-0634%2F%23id25

[4]

https://www.python.org/dev/peps/pep-0635/#id15: https://link.juejin.cn?target=https%3A%2F%2Fwww.python.org%2Fdev%2Fpeps%2Fpep-0635%2F%23id15

[5]

https://www.python.org/dev/peps/pep-0636/: https://link.juejin.cn?target=https%3A%2F%2Fwww.python.org%2Fdev%2Fpeps%2Fpep-0636%2F

相關焦點

  • 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 中只需要增加一個 = 符號,即可拼接運算表達式與結果
  • Python 3.10發布臨近,一文盡覽所有重要新特性和變化
    3.10 的發布日益臨近,是時候來看看它將帶來的最重要的新特性和變化了。作者:Martin Heinz編譯:McGL每年的這個時候,最新的 Python alpha 版本陸續發布(昨天剛發布了 alpha 第七版),第一個 beta 版即將推出(預計下個月3號),所以現在正是試用 Python 新版本的理想時機,看看 Python 3.10中有哪些酷炫的新功能即將推出!
  • Python 官宣:正式發布 Python 3.8.0!
    ,第一時間送達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.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.
  • Python 3.10來了,switch語法終於出現
    去年 10 月,Python 的 3.9 版正式發布了,從字典更新 / 合併到添加新的字符串方法,再到 zoneinfo 庫的引入,Python 3.9 添加了許多新特性.Python3.10 的第二個 alpha 版本也已於去年 11 月初發布,相比於不久前發布的 3.9 版本,新版本對類型注釋擴展、zip、位計數、字典映射又有了新的改進。
  • Python3.10發布,這個特性愛了愛了
    儘管總有一些不同的聲音拿Python運行慢來說事,不過真正在用Python的又有多少人care呢。3.10正式版發布Python在幾天前發布了正式版3.10,雖然你不一定會馬上應用到生產環境,不過還是建議有條件的可以升級體驗以下,沒條件直接看我這篇文章就可以了,我列了幾個開發者可能比較感興趣的特性,看看哪個是你最期待的特性。
  • 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.10重磅發布,這5個新特性愛了愛了!
    「ID: python_logic」嗨!大家好,我是酷頭歡迎來到學習python的寶藏基地~~~前兩天,Python官網發布了Python3.10.0。說實話,對於這次的升級,有幾個特性,還真是值得和大家講講。1.
  • Python3.9又更新了:dict內置新功能,正式版十月見面
    從文檔中,我們可以看到官方透露的對 dict、math 等組件增加的新特性,以及下一步的開發進展。自公開了 3.8 版本後,Python 的迭代依然在繼續。目前是 Python3.9,這是一個正在開發的 Python 版本。其最新的 alpha 4.0 版本——3.9.0a4 已經公開。
  • Wireshark 3.6.0正式發布,它有什麼新特性?
    前言本文主要講解Wireshark 3.6.0的新特性。最近,Wireshark發布了其免費開源的報文分析器的新版本Wireshark 3.6.0,該版本包含了所有新的特性和協議。最初被稱為Ethereal, Wireshark已經發展成為最可靠的網絡協議分析器之一。它實時捕獲數據包,並以人類可讀的格式顯示它們。Wireshark是絕對安全的。
  • Python2 倒計時,還不快來掌握 Python3 酷炫的新特性?|原力計劃
    作者 | 雲爬蟲技術研究筆記責編 | 郭芮出品 | CSDN 博客Python3.8已經發布近一個月了,距離Python3.0第一個版本發布也將超過10年了。前言首先我們先來講幾個時間點:Python2.7正式停止維護時間 2020年1月1日,距今還有1個多月Python3.8正式開始發布時間 2019年10月14日,距今1個多月
  • Python 3.8 新特性來襲
    但採用上述函數定義,pow(2, 10)和pow(2, 10, 5)都是正確的調用方式,而pow(2, 10, z=5)是不正確的。3.支持f字符串調試f字符串格式可以更方便地在同一個表達式內進行輸出文本和值或變量的計算,而且效率更高。輸出4。
  • Python 3.8.0 來襲,新特性搶先看
    Python 3.8.0版本在10月14日正式發布,其中包含大量新的特性與優化。與 Python 3.7相比,3.8系列的主要新特性(節選部分)有:PEP 572,賦值表達式新的語法("walrus operator"象牙運算符):=可以將值作為表達式的一部分分配給變量
  • Python 3.10來了
    去年 10 月,Python 的 3.9 版正式發布了,從字典更新 / 合併到添加新的字符串方法,再到 zoneinfo 庫的引入,Python 3.9 添加了許多新特性.Python3.10 的第二個 alpha 版本也已於去年 11 月初發布,相比於不久前發布的 3.9 版本,新版本對類型注釋擴展、zip、位計數、字典映射又有了新的改進。
  • Python3.6新特性官方文檔中文版
    中多出的新特性。另請參閱PEP 494 - Python 3.6 發布時間表摘要 - 發布亮點新的語法特性:PEP 498, 格式化字符串字面量PEP一個python36.zip文件現可用作一個地標(landmark)以臆指PYTHONHOME。 有關詳細信息,請參閱文檔。新特性PEP 498: 格式化字符串PEP 498引入了一種新的字符串:_f-strings_, 或者格式化字符串。
  • Python Django 3.0 框架正式發布
    3.0,各位 Python 前端程式設計師驚呼,求求你們,別更新啦,學不過來啦 ~~~下面是來自 Django 3.0 發布現場的最新報導,欲知詳情,請前往發布現場親自群毆,地址如下:https://docs.djangoproject.com/en/3.0/releases/3.0/縱覽Django 團隊提出以下幾點優勢,引誘大家升級到新版 Django:
  • Mule ESB 3.4 正式版發布
    Mule ESB 3.4 正式版發布了,3.4 版本在 ESB、CloudHub、Studio、Anypoint DataMapper
  • WTF Python:有趣且鮮為人知的Python特性
    這個有趣的項目意在收集 Python 中那些難以理解和反人類直覺的例子以及鮮為人知的功能特性,並嘗試討論這些現象背後真正的原理!雖然下面的有些例子並不一定會讓你覺得 WTFs,但它們依然有可能會告訴你一些你所不知道的 Python 有趣特性。我覺得這是一種學習程式語言內部原理的好辦法,而且我相信你也會從中獲得樂趣!
  • 為Python 3.9 版本添加中文關鍵字 — 寫在草蟒 39x 發布之前
    Python 3.9.0 已發布一月有餘。作為 Python 漢化版,草蟒當然會及時跟進。