跳至主要内容

Python 的 := 符號 (Assignment expressions)

· 閱讀時間約 2 分鐘

別名海象符號

What’s New In Python 3.8: Assignment expressions

PEP 572 – Assignment Expressions

3.8 加入的這個海象符號當年有注意到但沒看懂,也就被我淡忘掉了。

本來就很受不了多做一次不必要運算的行為,可是為了省那一次又多寫一個 assignment 也頗令人煩躁不舒爽,近期開始養成每天寫上一、兩題的習慣後特別有感。

讀到這則 Fastest Way to Read Excel in Python | Haki Benita 裡頭有用到才讓我回想起其存在並去找出究竟是什麼意思。

不算很常見,初見也不直覺,但用得上的時候真的能簡潔不少。

直接偷 release note 裡的例子來說明。

沒有 walrus operator 的情況下,一段程式懶惰的寫法如下:

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

前述的減少不必要運算的不偷懶寫法則可能變成:

n = len(a)

if n > 10:

print(f"List is too long ({n} elements, expected <= 10)")

用上這個新符號的化就能夠簡化成:

if (n := len(a)) > 10:

print(f"List is too long ({n} elements, expected <= 10)")

拿這個例子來看就很容易理解,也就是顧名思義 assign 的同時亦是一個 expression,所以才能用在 if 的後頭。

另一個顯然很好用的情況就是在 while loop 裡:

# Loop over fixed length blocks

while (block := f.read(256)) != '':

process(block)

傳統的寫法多半會變成:

block = f.read(256)

while block != '':

process(block)

block = f.read(256)