Python 3 8 0 正式版發布,新特性初體驗

2021-09-28 18:54:47 字數 4248 閱讀 2162

北京時間 10 月 15 日,python 官方發布了 3.8.0 正式版,該版本較 3.7 版本再次帶來了多個非常實用的新特性。

pep 572: assignment expressions

新增一種新語法形式::=,又稱為「海象運算子」(為什麼叫海象,看看這兩個符號像不像顏表情),如果你用過 go 語言,應該對這個語法非常熟悉。

具體作用我們直接用例項來展示,比如在使用正則匹配時,以往版本中我們會如下寫:

import re	

pattern = re.compile('a')

data = 'abc'

match = pattern.search(data)

if match is not none:

print(match.group(0))

而使用賦值表示式時,我們可以改寫為:

if (match := pattern.search(data)) is not none:	

print(match.group(0))

在 if 語句中同時完成了求值、賦值變數、變數判斷三步操作,再次簡化了**。

下面是在列表表示式中的用法:

filtered_data = [y for x in data if (y := func(x)) is not none]

pep 570: python positional-only parameters

新增乙個函式形參標記:/,用來表示標記左側的引數,都只接受位置引數,不能使用關鍵字引數形式。

>>> def pow(x, y, z=none, /):	

... r = x ** y

... return r if z is none else r%z

...

>>> pow(5, 3)

125

>>> pow(x=5, y=3)

traceback (most recent call last):

file "", line 1, in typeerror: pow() takes no keyword arguments

這實際上是用純 python **來模擬現有 c **實現的內建函式中類似功能,比如內建函式len('string')傳參是不能使用關鍵字引數的。

pep 578: python runtime audit hooks

這讓我們可以對某些事件和 api 新增一些鉤子,用於在執行時監聽事件相關的引數。

比如這裡監聽 urllib 請求:

>>> import sys	

>>> import urllib.request

>>> def audit_hook(event, args):

... if event in ['urllib.request']:

... print(f' ')

...

>>> sys.addaudithook(audit_hook)

>>> urllib.request.urlopen('')

event = 'urllib.request' args =( '' , none , {}, 'get' )

官方內建了一些 api,具體可檢視 pep-578 規範文件[1],也可以自定義。

在 python 3.6 版本中增加了 f-strings,可以使用 f 字首更方便地格式化字串,同時還能進行計算,比如:

>>> x = 10	

>>> print(f'')

11

在 3.8 中只需要增加乙個=符號,即可拼接運算表示式與結果:

>>> x = 10	

>>> print(f'')

'x+1=11'

這個特性官方指明了適用於 debug。

在之前版本的 python 互動模式中(repl),涉及到 asyncio 非同步函式,通常需要使用asyncio.run(func())才能執行。

而在 3.8 版本中,當使用python -m asyncio進入互動模式,則不再需要asyncio.run

>>> import asyncio	

>>> async def test():

... await asyncio.sleep(1)

... return 'test'

...

>>> await test()

'test'

在 python 多程序中,不同程序之間的通訊是常見的問題,通常的方式是使用multiprocessing.queue或者multiprocessing.pipe,在 3.8 版本中加入了multiprocessing.shared_memory,利用專用於共享 python 基礎物件的記憶體區域,為程序通訊提供乙個新的選擇。

from multiprocessing import process	

from multiprocessing import shared_memory

share_nums = shared_memory.shareablelist(range(5))

def work1(nums):

for i in range(5):

nums[i] += 10

print('work1 nums = %s'% nums)

def work2(nums):

print('work2 nums = %s'% nums)

if __name__ == '__main__':

p1 = process(target=work1, args=(share_nums, ))

p1.start()

p1.join()

p2 = process(target=work2, args=(share_nums, ))

p2.start()

# 輸出結果:

# work1 nums = [10, 11, 12, 13, 14]

# work2 nums = [10, 11, 12, 13, 14]

以上**中 work1 與 work2 雖然執行在兩個程序中,但都可以訪問和修改同乙個shareablelist物件。

熟悉 python web 開發的同學,對werkzeug.utils.cached_propertydjango.utils.functional.cached_property這兩個裝飾器一定非常熟悉,它們是內建@property裝飾器的加強版,被裝飾的例項方法不僅變成了屬性呼叫,還會自動快取方法的返回值。

現在官方終於加入了自己的實現:

•pep 587: python 初始化配置•pep 590: vectorcall,用於 cpython 的快速呼叫協議•finally:中現在允許使用continuetyped_ast被合併回 cpython•pickle現在預設使用協議4,提高了效能•load_global速度加快了 40%•unittest加入了非同步支援•在 windows 上,預設 asyncio 事件迴圈現在是proactoreventloop•在 macos 上,multiprocessing啟動方法預設使用spawn

更多特性可檢視 what』s new in python 3.8[2]

[1]pep-578 規範文件:[2]what』s new in python 3.8: 

漢文博士正式版發布

經過一年多的開發,漢文博士正式版已經發布了!新增功能 更新統一碼資料庫為 7.0。增加漢字筆畫數偏好選項。簡繁體 異體字轉換。漢字文字排序。選中單個漢字時顯示該漢字的簡繁變體和讀音。修改功能 程式載入器檢測 net framework 2.0 4.0 是否安裝。程式自動檢測基礎資料庫是否存在。發行版...

IE8 正式版發布

ie8正式版終於發布了,一直使用ie的最新版本,無論是測試還是正式版都會第一時間使用,期望微軟能夠給人欣喜。windows xp 64位 windows vista 64 位 windows server 2003 64 位 windows server 2008 64 位 http downloa...

PHPCMS V9 3 4 正式版發布

近日,由包括知道創宇在內的多個安全公司聯合烏雲漏洞提交平台 推出的 漏洞獎勵計畫 裡播報了多個phpcms v9 sql注入漏洞。通過scanv 安全中心分析,這些漏洞屬於 高危 漏洞。目前官方已確定但未出相關補丁。請使用phpcms v9廣大站長們注意。本補丁只適用於20130522版本,公升級到...