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