日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
還在擼Python3.7,Python3.9新鮮出爐,帶你嘗鮮解讀

是不是感覺python3.7剛剛使用,3.8還沒捂熱乎,怎么3.9這么快就來了!其實版本迭代速度快,說明這門編程語言的活力強,對于我們使用者來說是件好事,而且誰也沒說必須使用最新版本,我到現(xiàn)在仍然在用python3.6。但是呢,新版本出來了一定要體驗一下,看看都有哪些改動和優(yōu)化,說不定哪個新特性就能解決你手里的大問題。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了博白免費建站歡迎大家使用!

1 新的特性

1).import異常

我們在進行模塊的相對引用時,可能會遇到這個錯誤提示:ValueError: Attempted relative import beyond toplevel package。簡單來說這個問題是由于引用的模塊超出了頂層目錄的層級結(jié)構(gòu)所導致的,這個問題不理解也沒關(guān)系,因為跟python3.9的特性更改關(guān)系不大。

我們只要知道,python3.9中對這類錯誤的raise類型進行了調(diào)整,當遇到這類錯誤的時候,會提示ImportError而不再是ValueError,PR如圖所示:

這個改動的最大好處就是當遇到這類問題時,系統(tǒng)會明確告訴你是由import模塊引發(fā)的。

2).__file__路徑

我們知道,在python中可以使用__file__、sys.argv[0]、sys.path[0]等方法獲取當前腳本的所在路徑,只不過在命令行模式下使用前兩個命令獲取到的都是相對路徑,只有第三個命令可以獲取腳本的絕對路徑。我們用以前版本的的python運行下面這段代碼:

 
 
 
  1. import sys 
  2. print(__file__) 
  3. print(sys.argv[0]) 
  4. print(sys.path[0]) 

得到結(jié)果如下:

而如果使用python3.9來運行結(jié)果就不一樣了(下圖),他對__file__和sys.argv[0]都做了調(diào)整,使其返回值全部為絕對路徑。

3).replace修復

replace是字符串處理中的常用函數(shù),他的原型其實是這樣的:

 
 
 
  1. str.replace(old, new[, max]) 

其中max是可選參數(shù),意思是替換不超過max次。但是在之前的python版本中,如果對空值進行這種形式的替換會有一點問題,例如下面這段代碼,它的輸出結(jié)果仍然為空。

 
 
 
  1. s = '' 
  2. s = s.replace('', 'python39', 1) 
  3. print(s) 

而在python3.9中對這一問題進行了修正,除非max賦值為0,否則會進行正常的替換操作。這一改動對bytes和bytearray對象同樣適用。

2 模塊改動

Python3.9并沒有為我們帶來新的內(nèi)置模塊,但是對一些模塊進行了修改,我們挑選幾個使用相對較多的進行說明。

1).ast

ast這個概念大家可能比較陌生,一般來說我們很少有機會用到它,我們只需要知道ast對象是類似一種樹形的語法結(jié)構(gòu)。來看下面這段代碼,他的作用就是把print(3+5)轉(zhuǎn)換成ast對象并打印。

 
 
 
  1. import ast 
  2. func_def = 'print(3+5)' 
  3. r_node = ast.parse(func_def) 
  4. print(ast.dump(r_node)) 

先使用之前的版本來運行,看看下圖中的輸出結(jié)果。我們不用看內(nèi)容,單從輸出格式而言,這串代碼既沒有換行也沒有縮進,看起來很費勁。

而python3.9則對這一問題進行了解決,它在dump()方法中新增了一個參數(shù) indent,代表的是首行縮進的字符長度,我們對上述代碼進行少許修改:

 
 
 
  1. import ast 
  2. func_def = 'print(3+5)' 
  3. r_node = ast.parse(func_def) 
  4. print(ast.dump(r_node, indent=2)) 

然后用python3.9來運行,結(jié)果如下,這次看起來是不是舒服多了。

2).asyncio

在python3.9中,新增了一個名為shutdown_default_executor()的協(xié)程,它的作用就是等待ThreadPoolExecutor中的所有線程執(zhí)行完畢,為默認線程安排關(guān)閉時間。

需要注意的是,調(diào)用此方法后,如果在默認線程中調(diào)用loop.run_in_executor()方法,將會引發(fā)RuntimeError。

此外,如果我們使用了asyncio.run()類的方法,那么shutdown_default_executor()將會自動調(diào)度。也就是說,對于asyncio的一般使用者來說,python3.9的改變并不會帶來什么實質(zhì)性影響。

3).threading

我們知道,在python的子解釋器中是不支持守護線程的,在之前的版本中,如果一個線程是從子解釋器中調(diào)用的守護線程,那么將會導致python程序的崩潰。

在python3.9中,遇到這種情況會引發(fā)RuntimeError,這相當于對整個程序加了一層保護。

4).pprint

Python3.9對pprint的修改主要體現(xiàn)在增加了對types.SimpleNamespace的支持。types.SimpleNamespace嚴格來說是一個簡單的對象子類,為了便于理解我們可以簡單地把他看作一個數(shù)據(jù)結(jié)構(gòu)。

下面我就來看看在之前的版本和python3.9中,對types.SimpleNamespace的數(shù)據(jù)進行pprint結(jié)果有什么不同,先來看一段代碼:

 
 
 
  1. import pprint 
  2. from types import SimpleNamespace 
  3. K = [str(i) for i in range(10)] 
  4. L = [str(i)*20 for i in range(10)] 
  5. D = dict(zip(K, L)) 
  6. sn = SimpleNamespace(**D) 
  7. pp = pprint.PrettyPrinter(indent=4) 
  8. pp.pprint(sn) 

其中變量sn返回的是一個命名空間,其結(jié)構(gòu)類似于一個dict字典,來看用之前版本的python運行腳本的輸出結(jié)果:

再來看python3.9中使用pprint的輸出結(jié)果(下圖),這下知道區(qū)別在哪了吧。

此外,python3.9中還對其他幾個模塊進行了修改,例如venv、os等,不過有些改動只針對特定操作系統(tǒng)(比如linux),這里不再一一羅列了。

3 其他優(yōu)化

除了上面提到的一些改動,python3.9還對一些比較底層的東西進行了優(yōu)化,這部分內(nèi)容我想大多數(shù)python使用者都涉及不到,大家了解下就好。

1).Build和C API

  • 提供Py_EnterRecursiveCall()和Py_LeaveRecursiveCall()作為limited API的常規(guī)函數(shù)。從stable API中刪除_Py_CheckRecursionLimit。
  • 向C API添加一個新的公共函數(shù)PyObject_CallNoArgs(),這個函數(shù)可以調(diào)用不含參數(shù)的可調(diào)用Python對象。
  • 全局變量PyStructSequence_UnnamedField在python3.9中修改為常量字符串。
  • 從Py_LIMITED_API.pyfpe.h中剔除PyFPE_START_PROTECT()和PyFPE_END_PROTECT()函數(shù)。
  • 刪除PyMethod_ClearFreeList()和PyCFunction_ClearFreeList()函數(shù)。

2).方法調(diào)整

  • 在之前的版本中,math.factorial()函數(shù)只接受非負整數(shù)值,否則將引發(fā)ValueError。在python3.9中該函數(shù)將棄用,任何參數(shù)都將引發(fā)TypeError。
  • 棄用parser模塊,并將在以后的Python版本中刪除。
  • 修改random模塊的seeds類型,今后只支持None,int,float,str,bytes和bytearray類型。
  • 始終允許打開GzipFile文件進行讀寫,即使不指定mode參數(shù)也不會發(fā)出警告。
  • 推薦使用_tkinter.TkappType的splitlist()方法代替split()方法。

3).移除模塊

  • collection.abc 里面的抽象基類將不在常規(guī)的 collection 模塊中公開。
  • 刪除 sys.getcheckinterval() 和 sys.setcheckinterval() 函數(shù)。
  • 刪除threading.Thread 的 isAlive() 方法。
  • 刪除 ElementTree 中的getchildren() 和 getiterator()方法。
  • 刪除 舊 plistlib 模塊的實現(xiàn),同時刪除其中的use_builtin_types 參數(shù)。

小結(jié):

總的來說,目前python3.9相對于3.8改變并不是很大,而且大多數(shù)都是一些偏底層的東西,我們一般用戶很少會碰到。不過,目前推出的python3.9.0a1只是第一個迭代版本,并不是正式版本。后續(xù)也有可能會有其他變動,但是按理說變化也不會太大。基于以上原因,個人認為大家可以繼續(xù)使用現(xiàn)有的版本學習和工作,如果你現(xiàn)在的版本不算很老的話。


網(wǎng)站標題:還在擼Python3.7,Python3.9新鮮出爐,帶你嘗鮮解讀
網(wǎng)頁鏈接:http://www.dlmjj.cn/article/dhohcsp.html