值得期待的Python 3.9的新功能
Python 3.9 beta預計下個月就要發布了,那么3.9有那些讓我們期待的新功能和變更呢?本我我們一起來說Python 3.9的新功能的。
安裝測試版
為了能夠實際探索Python 3.9 的功能,我們需要先下載一個Python 3.9 alpha/beta并安裝。
- wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0a5.tgz
- tar xzvf Python-3.9.0a5.tgz
- cd Python-3.9.0a5
- ./configure --prefix=/home/chongchong/python-3.9
- make
- make install
這樣python測試版本就會安裝完成,我們通過
- /home/chongchong//python-3.9/bin/python3.9
運行此命令后,會顯示當前版本和提示消息:
新區操作符
最值得期待的新功能是新字典合并運算符:|和|=。當前,我們要對字典合并要的做法,假設有兩個字典:
- d1 = {"x": 1, "y": 4, "z": 10}
- d2 = {"a": 7, "b": 9, "x": 5}
我們希望結果為:
- {'x': 5, 'y': 4, 'z': 10, 'a': 7, 'b': 9}
方法1:
- d = dict(d1, **d2)
方法2:
- d = d1.copy()
- d.update(d2)
方法3:
- d = {**d1, **d2}
方法1使用dict(iterable, **kwargs)初始化字典的函數:第一個參數是普通字典,第二個參數是鍵/值對列表,在這種情況下,是使用**操作符解壓縮的另一個字典。
方法2使用update功能用第二個字典中的鍵值對更新第一個字典。由于該操作會修改原始字典,因此我們需要將第一個字典復制到最終變量中,以避免修改原始字典。
方法3是最簡練的解決方案,使用了字典解壓縮并將兩個變量(d1和d2)解壓縮為結果變量d。
三種方法都可以用,在python 3.9中,我們還可以使用新的|操作法來解決。
新操作符方法:
方法4:
- d = d1 | d2
- d = {'x': 5, 'y': 4, 'z': 10, 'a': 7, 'b': 9}
方法5:
- d1 |= d2
- d1 = {'x': 5, 'y': 4, 'z': 10, 'a': 7, 'b': 9}
上面的方法4與方法1的拆包(d = {**d1, **d2})非常相似。方法5可用于就地合并,其中原始變量(d1)被第二操作數(d2)的值更新。
拓撲順序
functools模塊的TopologicalSorter可能是值得關注的另一項新功能。該類允許我們使用拓撲順序對圖進行排序。拓撲順序是這樣的順序,其中對于2個節點u和v通過向邊連接uv(從u至v)u在v前
在引入此功能之前,我們必須使用Khan的算法或深度優先搜索(不是完全簡單的算法)手動來實現。在pyton 4.9中,如果需要對依賴作業進行排序以進行調度,則只需執行下面的操作:
- from functools import TopologicalSorter
- graph = {"A": {"D"}, "B": {"D"}, "C": {"E", "H"}, "D": {"F", "G", "H"}, "E": {"G"}}
- ts = TopologicalSorter(graph)
- list(ts.static_order())
結果:
- ['H', 'F', 'G', 'D', 'E', 'A', 'B', 'C']
在上面的示例中,我們首先使用字典創建圖,其中鍵是傳出節點,值是它們的鄰居集。之后,我們使用圖形創建sorter的實例,然后調用static_order函數以產生排序。請記住,此順序可能取決于插入順序,因為當2個節點處于同一圖形級別時,它們將按插入順序返回。
除了靜態的排序,此類還支持節點的并行處理,比如與任務隊列工作。
IPv6范圍的地址
Python 3.9中引入的另一個變化是可以指定IPv6地址的范圍。對不不熟悉IPv6的人來說,通過IPv6范圍,它可以用來驗證IP的有效性。范圍可以在IP地址的末尾使用%符號指定,例如"3FFE:0:0:1:200:F8FF:FE75:50DF%2"。該IP地址為范圍內2,即鏈接本地地址。
因此,如果需要在Python中處理IPv6地址,現在可以這樣處理:
- from ipaddress import IPv6Address
- addr = IPv6Address('ff02::fa51%1')
- print(addr.scope_id)
結果為:
"1" – 表示網卡本地地址。
但是,使用IPv6范圍時應注意一件事。使用基本的Python運算符進行比較時,范圍不同的兩個地址不相等。
新math功能
Python 3.9在math模塊中,添加或改進了許多其他功能。
- import math
- math.gcd(80, 64, 152)
8
以前計算最大公因數的函數(gcd)只能應用于2個數字,所以,我們不得不要變相使用math.gcd(80, math.gcd(64, 152))的方法來處理。從Python 3.9開始,gcd可以將其應用于任意數量的值。
math模塊的新增加的功能是math.lcm:
- math.lcm(4, 8, 5)
40
math.lcm用來計算其參數的最小公倍數。與gcd相同,它允許可變數量的參數。
還有兩個新增加的功能是math.nextafter和math.ulp:
- math.nextafter(4, 5)
4.000000000000001
- math.nextafter(9, 0)
8.999999999999998
- math.ulp(1000000000000000)
0.125
- math.ulp(3.14159265)
4.440892098500626e-16
math.nextafter(x, y)功能是非常簡單:它表示往后面浮動x到y趨勢,同時增加浮點數精度的近似(根據確實補0或者9)。
而math.ulp用作數值計算精確的測量。最簡短的解釋是使用示例:
假設我們沒有64位計算機。相反,我們只有3位數字。用這3位數字可以表示3.14而不是3.141。使用3.14,我們可以代表的最接近的較大數字是3.15,這2個數字相差1個ULP(最后一個單位),即0.1。因此,math.ulp返回值如上面示例。
新的字符串函數
Python 3.9中,字符串也添加了兩個新的便捷功能:
removeprefix,去掉前綴
- "someText".removeprefix("some")
結果為"Text"
removesuffix,去掉后綴
- "someText".removesuffix("Text")
"some"
對這兩個函數的功能可以使用string[len(prefix):]前綴和string[:-len(suffix)]后綴來實現的功能。但是這樣的操作在日常很常見,所以增加這兩個函數可以帶來很多便捷。
HTTP代碼
還有一個需要提及的新功能是HTTP模塊中已經增加了狀態碼http.HTTPStatus。即是:
- import http
- http.HTTPStatus.EARLY_HINTS
- # <HTTPStatus.EARLY_HINTS: 103>
- http.HTTPStatus.TOO_EARLY
- # <HTTPStatus.TOO_EARLY: 425>
- http.HTTPStatus.IM_A_TEAPOT
- # <HTTPStatus.IM_A_TEAPOT: 418>
http.HTTPStatus這些狀態碼會對我們處理http協議中的很多問題帶來便捷。
結論
Python 3.9目前還處于Alpha階段,下個月發布beta版本,到正式版發布已經為時不多了,希望該文章介紹能對我們版本升級更換有所幫助。