知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
來嘗個(gè)鮮,Python3.8幾大新功能體驗(yàn),沖鴨!
發(fā)表時(shí)間:2019-7-23
發(fā)布人:葵宇科技
瀏覽次數(shù):39
作者 | 小劉
來源 | 菜鳥學(xué)Python
繼3.7版本之后Python再次發(fā)布了新版本,雖然新版本帶來了不少調(diào)整,但是其中很大一部分都是對(duì)代碼底層設(shè)計(jì)的修改,又或是typing、pickle等不常用的功能,對(duì)多數(shù)用戶而言影響不大,今天我想重點(diǎn)聊一聊那些將對(duì)我們的代碼編寫產(chǎn)生較大影響的新功能。
在體驗(yàn)開始前先說下準(zhǔn)備工作,由于Python3.8還沒有正式發(fā)布,因此通過Anaconda的多版本管理搭建Python3.8新環(huán)境的方法是行不通的,我的做法是到官網(wǎng)下載對(duì)應(yīng)的最新版本后單獨(dú)安裝。
為了避免與現(xiàn)有環(huán)境沖突,將其更名為Python38(下圖),下文中的Python如無特殊說明均為Python3.6, Python38為Python3.8。接下來就正式開始新特性體驗(yàn)。
1.字典逆序
我們都知道Python中的字典是無序的,Python3.6對(duì)這一問題進(jìn)行了修訂,默認(rèn)情況下會(huì)按照鍵的創(chuàng)建順序進(jìn)行排序,但也僅限于此,你無法像列表那樣對(duì)字典直接進(jìn)行排序操作。
這一情況在Python3.8中進(jìn)一步得到改善,Python3.8中reversed()方法增加了對(duì)字典對(duì)象的支持,可以對(duì)字典進(jìn)行逆序操作。
在下面這段代碼中,對(duì)字典進(jìn)行簡(jiǎn)單的迭代,將會(huì)按照順序輸出字典的鍵。
現(xiàn)在改變一下代碼,加入reversed()方法:
先來看使用Python3.6的運(yùn)行結(jié)果(下圖),可以看到在Python3.6中,字典是不支持recersed()方法的。
然后用Python3.8運(yùn)行結(jié)果如下可以看到,字典按照鍵創(chuàng)建順序的逆序進(jìn)行了輸出。雖然只是非常小的一點(diǎn)功能提升,但是在某些場(chǎng)景下對(duì)于字典對(duì)象的應(yīng)用可能會(huì)起到非常關(guān)鍵的作用。
2.位置參數(shù)
在Python3.8中的參數(shù)傳遞方面引入了一個(gè)新的特性:PEP 570 Positional-Only Argument——限定位置參數(shù),下面就詳細(xì)聊聊這究竟是怎么回事。
一般來說,Python中的參數(shù)傳遞有三種形式:位置參數(shù)、關(guān)鍵字參數(shù)和可變參數(shù),為了避免不必要的麻煩,規(guī)定在可變參數(shù)之后只允許使用關(guān)鍵字參數(shù)??墒羌幢闳绱?strong>還是給程序員們留下了很大的自由空間,比如在可變參數(shù)之前,位置參數(shù)和關(guān)鍵字參數(shù)的使用幾乎不受限制。這樣就出現(xiàn)了一個(gè)問題,假如一個(gè)團(tuán)隊(duì)中很多人進(jìn)行合作開發(fā),函數(shù)的定義形式和調(diào)用模式是很難規(guī)范和統(tǒng)一的。
因此Python3.8就引入了一個(gè)“Positional-Only Argument”的概念和分隔符“/”,在分隔符“/”左側(cè)的參數(shù),只允許使用位置參數(shù)的形式進(jìn)行傳遞。
舉個(gè)例子來進(jìn)行說明,首先建立下面這樣一個(gè)函數(shù),由于函數(shù)中使用了分隔符“/”,因此只能使用Python3.8運(yùn)行。
def add_num(x, y, z=100, /, a=100): print(x + y + z + a)
print(x + y + z + a)
嘗試以下面這種方式調(diào)用函數(shù):
add_num(1, 2, z=4, a=5)
結(jié)果在運(yùn)行的時(shí)候發(fā)生了報(bào)錯(cuò):
接著嘗試全部以位置參數(shù)的形式調(diào)用函數(shù)(如下),結(jié)果順利執(zhí)行。可見“Positional-Only Argument”對(duì)分隔符“/”右側(cè)的參數(shù)形式并沒有限制。
# 輸入add_num(1, 2, 4, 5)# 輸出12
add_num(1, 2, 4, 5)
# 輸出
12
那么如果只給定前兩個(gè)參數(shù),后面兩個(gè)參數(shù)使用默認(rèn)值又如何呢?通過下面的調(diào)用可以發(fā)現(xiàn),也是可以正常運(yùn)行的。
# 輸入add_num(1, 2)# 輸出203
add_num(1, 2)
# 輸出
203
通過上面這個(gè)例子我們發(fā)現(xiàn)Python3.8對(duì)于參數(shù)傳遞的限制僅僅作用于分隔符“/”的左側(cè),而且只是在函數(shù)調(diào)用時(shí)發(fā)生作用。
3.賦值表達(dá)式
Python3.8中新增了賦值表達(dá)式“:=”操作符,簡(jiǎn)單來說就是把運(yùn)算操作和賦值操作放在了一起,有點(diǎn)類似于“a+=b”這種表達(dá)方式,我想賦值表達(dá)式的出現(xiàn)應(yīng)該是python追求簡(jiǎn)潔的傳統(tǒng)理念所致。
來看下面這段代碼,在func函數(shù)的if語句中,運(yùn)算、賦值、判斷操作在同一條語句中完成,即使變量a原本不存在也沒關(guān)系。
# 輸入def func(x, y, z): if (a := x + y) != z: print(a) else: print(z)func(1, 2, 5)# 輸出3
def func(x, y, z):
if (a := x + y) != z:
print(a)
else:
print(z)
func(1, 2, 5)
# 輸出
3
當(dāng)然,就上面這段代碼本身來看,將 x+y 的結(jié)果進(jìn)行賦值似乎意義不大,但是如果運(yùn)算表達(dá)式的計(jì)算量非常大或者要進(jìn)行大規(guī)模獨(dú)寫等操作的話,重復(fù)執(zhí)行對(duì)代碼的效率將造成大的影響;而如果事先對(duì)運(yùn)算表達(dá)式賦值則需要多寫一行代碼。
目前來看,賦值表達(dá)式最重要的作用就是使代碼變得更加簡(jiǎn)潔,至于運(yùn)行效率的差異,目前還沒有驗(yàn)證。
4.快速調(diào)試
在之前的Python版本中,“f表達(dá)式”——f'{expr}'的作用與eval()函數(shù)基本相同,例如:
f'{[1, 2, 3, 4, 5, 6]}'的結(jié)果是列表[1, 2, 3, 4, 5, 6];
f'{3 + 2}'的結(jié)果是運(yùn)算后的值5。
Python3.8中對(duì)該功能進(jìn)行了優(yōu)化,f'{expr}'語句中增加了對(duì)等號(hào)“=”的支持,在保留原來功能的基礎(chǔ)上,還能夠同時(shí)輸出運(yùn)算表達(dá)式本身。
例如執(zhí)行先面這段代碼,除了計(jì)算并輸出運(yùn)算結(jié)果外,還會(huì)將“=”和其左側(cè)的算式一并輸出:
x = 3print(f'{x * 2 = }')
print(f'{x * 2 = }')
執(zhí)行結(jié)果:
f'{expr}'不僅適用于基本的算術(shù)運(yùn)算,還能夠進(jìn)行其他對(duì)象的操作,以列表為例,令lst=[1, 2, 3, 4, 5, 6],現(xiàn)在對(duì)其進(jìn)行擴(kuò)展操作:
lst = eval('[1, 2, 3, 4, 5, 6]')print(f'{lst = }')print(f'{lst + [7] = }')
print(f'{lst = }')
print(f'{lst + [7] = }')
運(yùn)行結(jié)果如下:
函數(shù)運(yùn)算同樣適用,例如對(duì)兩個(gè)列表求交集,執(zhí)行下面這段代碼:
lst1 = [1, 2, 3, 4, 5]lst2 = [3, 5, 7]print(f'{list(set(lst1).intersection(set(lst2))) = }')
lst2 = [3, 5, 7]
print(f'{list(set(lst1).intersection(set(lst2))) = }')
運(yùn)行結(jié)果:
相比僅輸出結(jié)果,連帶運(yùn)算表達(dá)式一起輸出有助于定位檢查,在調(diào)試代碼的時(shí)候使用真的是快捷又方便。
5.共享內(nèi)存
進(jìn)程是系統(tǒng)進(jìn)行資源分配的獨(dú)立單位,在以前的python版本中,進(jìn)程間的數(shù)據(jù)交互只能通過Queue、Pipes等方式來實(shí)現(xiàn),數(shù)據(jù)無法直接共享。
在Python 3.8中,multiprocessing模塊提供了SharedMemory類,可以在不同的Python進(jìn)程之間創(chuàng)建共享的內(nèi)存block。目前支持int、float、str、bytes、bool、None、numpy.ndarray等一部分Python對(duì)象。
還是舉個(gè)例子來進(jìn)行說明,在下面這段代碼中建立了2個(gè)進(jìn)程,在進(jìn)程1中對(duì)列表中的每個(gè)元素執(zhí)行+10操作,進(jìn)程1結(jié)束后執(zhí)行進(jìn)程2,輸出列表內(nèi)容。
由于進(jìn)程之間數(shù)據(jù)無法共享,因此進(jìn)程2中輸出的列表是沒有進(jìn)行過+10操作的內(nèi)容:
現(xiàn)在我們對(duì)代碼進(jìn)行一下小小的修改,nums不是作為一個(gè)普通的list,而是作為一個(gè)共享內(nèi)存對(duì)象來創(chuàng)建,代碼如下:
由于shared_memory是Python3.8中的新增內(nèi)容,因此在Python3.6下運(yùn)行會(huì)出錯(cuò),我們還是用Python3.8來運(yùn)行這段代碼(結(jié)果如下)可以看到,進(jìn)程2中輸出的結(jié)果與進(jìn)程1中是一樣的,兩個(gè)進(jìn)程之間通過shared_memory實(shí)現(xiàn)了數(shù)據(jù)共享。
當(dāng)然,shared_memory在實(shí)際應(yīng)用中肯定不會(huì)如此簡(jiǎn)單,
比如SharedMemory.ShareableList和SharedMemory.SharedMemory的使用本身有很多規(guī)則和限制、
比如需要考慮數(shù)據(jù)鎖的問題等等,
但是共享內(nèi)存確實(shí)為進(jìn)程間通訊提供了一個(gè)新的解決方案,而且據(jù)說其通訊效率也是非常之高的。
Python3.8發(fā)布的新特性和新功能還有很多,對(duì)一些內(nèi)置模塊的改進(jìn)和優(yōu)化則更多,想嘗鮮的同學(xué)可以點(diǎn)擊閱讀原文,了解Python3.8詳情!你對(duì)Python3.8新特性怎么看,歡迎吱一聲留言!
—————————————
往期精彩:
人民日?qǐng)?bào)終發(fā)文:國航“避重就輕、不作為、護(hù)犢子、體驗(yàn)差、聽不進(jìn)批評(píng)”
華為延期,三星下架,講講折疊屏為什么這么難
遇事不決賴毛子,美國這次打算封殺變臉APP
相關(guān)案例查看更多
相關(guān)閱讀
- 云南網(wǎng)絡(luò)公司
- 小程序表單
- 昆明網(wǎng)站制作
- 百度小程序開發(fā)公司
- 云南電商網(wǎng)站建設(shè)
- 汽車報(bào)廢
- 云南網(wǎng)站建設(shè)哪家強(qiáng)
- 報(bào)廢車回收管理軟件
- 關(guān)鍵詞快速排名
- 云南網(wǎng)站建設(shè)公司地址
- 花農(nóng)小程序
- 云南網(wǎng)頁制作
- 人人商城
- 網(wǎng)站建設(shè)公司地址
- 小程序定制開發(fā)
- 小程序商城
- 云南省建設(shè)廳網(wǎng)站官網(wǎng)
- 網(wǎng)站上首頁
- 云南小程序設(shè)計(jì)
- 網(wǎng)絡(luò)公司聯(lián)系方式
- 網(wǎng)站建設(shè)公司網(wǎng)站
- 網(wǎng)站建設(shè)首頁
- 報(bào)廢車
- asp網(wǎng)站
- 曲靖小程序開發(fā)
- web開發(fā)技術(shù)
- 網(wǎng)絡(luò)營銷
- 云南小程序代建
- 網(wǎng)站建設(shè)哪家強(qiáng)
- .net網(wǎng)站