本文同步發表於隨性筆記
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也是要加&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)
其中a
、b
、c
用位置傳遞參數,而d
、e
、f
是關鍵字傳遞參數。
但如果改成:
def f(a, b, /, c, d, *, e, f): print(a, b, c, d, e, f)
a
、b
就只能用位置傳遞參數,而e
、f
只能用關鍵字傳遞參數。至於c
、d
不受限制。
其實我原本覺得這沒啥用,不過有**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
。而在原本版本這麼呼叫會報錯:
Python 3.8還有相當多細小的改動,以上就是幾個我覺得比較有意思的。