海象运算符在那里 PEP 572 直到被提出 3.8 版本合并发布。
它的英文原名是 Assignment Expressions
,翻译就是这样 赋值表达式
,但现在人们更常称之为海象运算符,因为它看起来真的太像海象了。
有些朋友可能是第一次接触到这个新特征,所以简单介绍一下这个海象运算符有什么用?
在 Golang 条件语句中的条件语句可以直接在中间 if 获得中运算变量后,可以直接判断变量,这样可以少写一行代码
import"fmt" funcmain(){ ifage:=20;age>18{ fmt.Println("已经成年了") } }
若在 Python 3.8 之前,Python 必须这样写
age=20 ifage>18: print("已经成年了")
但是有了海象运算符,你就可以和了 Golang 同样(如果你没有学过 Golang,这里要注意,Golang 中的 :=
称为短变量声明,意思是声明并初始化,它和 Python 中的 :=
不是概念)
if(age:=20)>18: print("已经成年了")2. 第二种用法:while
在不使用 在使用海象运算符之前 while 当你循环阅读文件时,你可能会这样写
file=open("demo.txt","r") whileTrue: line=file.readline() ifnotline: break print(line.strip())
但是有了海象运算符,你可以这样做
file=open("demo.txt","r") while(line:=file.readline()): print(line.strip())
用它代替以前的 while 循环写法更令人惊叹
例如,实现一个需要命令行交互输入密码并检查的代码,你可能会这样写
whileTrue: p=input("Enterthepassword:") ifp=="youpassword": break
有了海象运算符,这样写起来更舒服
while(p:=input("Enterthepassword:"))!="youpassword": continue3. 第三种用法:推导式
这一系列的文章,几乎每一篇文章都能看到推导式的身影,这篇文章依然如此。
在编码过程中,我喜欢使用推导式,在简单的应用场景中,它简单而高效。
在下面的代码中,我将使用列表推导得出所有会员中肥胖的人 bmi 指数
members=[ {"name":"小五","age":23,"height":1.75,"weight":72}, {"name":"小李","age":17,"height":1.72,"weight":63}, {"name":"小陈","age":20,"height":1.78,"weight":82}, ] count=0 defget_bmi(info): globalcount count+=1 print(f"执行了{count}次") height=info["height"] weight=info["weight"] returnweight/(height**2) #发现所有会员中肥胖者的bmi指数 fat_bmis=[get_bmi(m)forminmembersifget_bmi(m)>24] print(fat_bmis)
输出如下
执行了1次 执行了2次 执行了3次 执行了4次 [25.88057063502083]
可以看出,会员数量只有 3 个,但是 get_bmi 但是函数执行了 4 第二,原因是在判断中执行 3 第二,在构建新列表时重复执行。
如果所有会员都太肥胖,最终会执行 6 第二,这种性能在大量数据下是浪费的,所以我通常使用传统的for结构 循环 + if 判断。
fat_bmis=[] #发现所有会员中肥胖者的bmi指数 forminmembers: bmi=get_bmi(m) ifbmi>24: fat_bmis.append(bmi)
有了海象运算符,你就不必在这种情况下妥协了。
#发现所有会员中肥胖者的bmi指数 fat_bmis=[bmiforminmembersif(bmi:=get_bmi(m))>24]
最后,从输出结果可以看出,只执行 3 次
执行了1次 执行了2次 执行了3次 [25.88057063502083]
这里只介绍列表推导式,但也适用于字典推导式和集合推导式。不再演示。
海象运算符是一个新颖的特征,许多人认为它会破坏代码的可读性。当一件新事物刚刚出来时,这是真的,但我相信,经过时间的沉淀,越来越多的人使用它,享受它带来的便利,这种争议将在漫长的历史河流中慢慢消失。