條件賦值 python3 8新特性 賦值表示式

2021-10-16 03:26:57 字數 2096 閱讀 6775

python3.8引入了很多新特性,咱們今天在這裡只說乙個就是賦值表示式,很多小夥伴會很驚訝,我進來了你就給我說這個?那種語言沒有賦值表示式?很low的東西!那你還真就說錯了,python3.8以前沒有賦值表示式,但有賦值語句,所以python3.8之前賦值必須單獨佔一行,不能和其他表示式混合計算,為什麼呀?不就是賦值是語句不是表示式嗎?

# python3.8 賦值表示式

res = (a := 3)

print(res)

# python3.8以前,語法錯誤

# res = (a = 3)

上面這段**中「:=」就是賦值運算子,也叫海象運算子(因為很想海象的兩隻眼睛和長牙),它是原來的賦值運算子(=)的補充,能夠完成和「=」一樣的功能,但「:=」最大的特點就是它可以寫賦值表示式:

3 + (a:=5) + 6  # (a:=5)就是賦值表示式
它的優點是可以防止多次計算重複值和可以寫賦值表示式。例如:

在這個示例中,賦值表示式可以避免呼叫len()兩次:

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

print(f"list is too long ( elements, expected <= 10)")

類似的益處還可出現在正規表示式匹配中需要使用兩次匹配物件的情況中,一次檢測用於匹配是否發生,另一次用於提取子分組:

discount = 0.0

if (mo := re.search(r'(d+)% discount', advertisement)):

discount = float(mo.group(1)) / 100.0

此運算子也適用於配合 while 迴圈計算乙個值來檢測迴圈是否終止,而同乙個值又在迴圈體中再次被使用的情況:

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

process(block)

另乙個值得介紹的用例出現於列表推導式中,在篩選條件中計算乙個值,而同乙個值又在表示式中需要被使用:

[clean_name.title() for name in names

if (clean_name := normalize('nfc', name)) in allowed_names]

但海象運算子不應濫用,盡量不要有過多的巢狀,避免邏輯的混亂。

為了避免模稜兩可或使用者混淆,在某些地方不允許使用賦值表示式:

y:= f(x)#無效

(y:= f(x))#有效,但不建議使用

y0 = y1:= f(x)#無效

y0 =(y1:= f(x))#有效,但不鼓勵使用

foo(x = y:= f(x))#無效

foo(x =(y:= f(x)))#有效,儘管可能會造成混淆

def foo(answer = p:= 42):#無效

...def foo(answer =(p:= 42)):#有效,但樣式不好

(lambda:x:= 1)#無效

lambda:(x:= 1)#有效,但不太可能有用

(x:= lambda:1)#有效

lambda行:(m:= re.match(pattern,line))和m.group(1)#有效

>>> f''#有效,使用賦值表示式

'10'

>>> x = 10

>>> f''#有效,將'= 10'傳遞給格式化程式

'10'

原創不易,喜歡的話請點贊收藏。

體驗一下 Python 3 8 帶來的主要新特性

學習理解乙個軟體非常好的方法就是跟隨每乙個版本演進的新特性,好比乙個人被別人看著長大的,知子莫若父。因此每個版本的 changelogs 或 what s new 是非常值得一讀的,見 what s new in python 3.8。因為接觸 python 比較晚,沒能即時的重前往後的看過 pyt...

python3 8中新增的三個特性

由於之前學習以及專案中一直用的是python3.6.5,最近幾天在學習之餘看了一下python3.8的官方文件,了解了一下python3.8.x中新增的特性。以此來記錄一下。1.海象運算子 python3.8.x中新增了海象運算子 可以在區域性 塊中的表示式給變數賦值,並且該變數可以用於該 塊中。該...

python3 8使用aiml總結

切換到.aiml所在工作目錄 os.chdir alice path alice aiml.kernel 通過std startup.xml啟動aiml alice.learn std startup.xml aiml檔案有修改時可以通過load aiml b 在xml中pattern配置 進行修改...