Python3.8的幾個我覺得有意思的新特性

本文同步發表於隨性筆記

 

Python 3.8同樣有不少變動,有些蠻細微的,需要詳細了解可能還是直接看Python 3.8 有什么新变化der好。現在文檔都有(簡體)中文版,覺得比英文好讀多了。所以這篇只會分享幾個我覺得有意思的新特性。

遺憾的是,我還沒有更新到3.8,只能看看而已😭。

f-Strings

這個特性我單獨寫了一篇,歡迎看看:Python-3.8後的f-String

象牙運算符(:=)

寫過Golang、Rust的同鞋,對於這個運算符應該蠻熟悉的,這另這兩個語言有自動推導類型的能力。不過在Python裡,是相較於asign運算符(=),象牙運算符(:=)更像表達是,而非語句。要我寫的話,偽代碼可能有點像:

# @symbol var
def :=(val):
nonlocal var
var = val
return var

賦予完變數值後,返回變數的值。這麼一來可以寫在任何需要表達式的地方(如果我理解錯的話0.0)。來看幾個文件上的範例:

if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")

原本f-Strings裡可能要寫"{len(a)}",但是這樣做的話就無須在對len(a)求值一次;或是在外圍設定變數值n = len(a)。(儘管最近觀察,內置內行的len(var)求值,可能還比賦予值(=)消耗成本還低)

接下來這例子就讓我真的很想用了:

# Loop over fixed length blocks
while (block := f.read(256)) != '':
process(block)

我一度在想會不會有while expr as var:的語句。雖然沒有,不過用:=可以更為靈活。

PEP 578: Python 運行時審核鉤子

PEP 578: Python 运行时审核钩子。這特性在開發框架比較會用到,給的訊息也不多。(但我從其他語言的觀察來看,鉤子(hook)真的很好用)

C API 初始化配置

PEP 587: Python 初始化配置。我自己有些過一點Python提供的C API,但到時候有要再用到,再來看wwww。

僅位置形參

這個在寫API的可能才會比較用到。其他語言好像比較少見,Common Lisp也是要加&amp;key才會變成關鍵字參數,但是Python原本就允許位置參數和關鍵字參數混用。可能在某些情況會造成誤用,所以多加了/*,用來明確指名參數可允許傳遞方式。

原本函式可能這麼寫:

def f(a, b, c, d, e, f):
print(a, b, c, d, e, f)

然後這樣呼叫:

f(10, 20, 30, d=40, e=50, f=60)

其中abc用位置傳遞參數,而def是關鍵字傳遞參數。

但如果改成:

def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)

ab就只能用位置傳遞參數,而ef只能用關鍵字傳遞參數。至於cd不受限制。

其實我原本覺得這沒啥用,不過有**argk的參數時,就不太一樣了!看看文件範例:

def f(a, b, /, **kwargs):
print(a, b, kwargs)

f(10, 20, a=1, b=2, c=3) # a and b are used in two ways
# output: 10 20 {'a': 1, 'b': 2, 'c': 3}

這樣一來,因為a只能是位置參數,所以可以而外指定一個關鍵字參數a。而在原本版本這麼呼叫會報錯:

Python3 測試關鍵字參數


Python 3.8還有相當多細小的改動,以上就是幾個我覺得比較有意思的。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.