北京時間 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_property
與django.utils.functional.cached_property
這兩個裝飾器一定非常熟悉,它們是內建@property
裝飾器的加強版,被裝飾的例項方法不僅變成了屬性呼叫,還會自動快取方法的返回值。
現在官方終於加入了自己的實現:
•pep 587: python 初始化配置•pep 590: vectorcall,用於 cpython 的快速呼叫協議•finally:
中現在允許使用continue
•typed_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版本,公升級到...