目录
本博客主要参考为北京大学陈斌老师的下一站Python
概述
赋值表达式是python3.8+的新特性。如果你想要使用它,请注明所需python>=3.8.
语法(海象运算符)
<名字> := <表达式>
- 语义:计算表达式的值,并且用名字来引用它
- 与赋值语句的区别:这是个表达式,可以参与计算(必须带圆括号),附送一个变量
b = (a := 7) * 33
print(a, b)
为什么需要这个?
- 表达式的一部分,尤其是函数调用,要被多处引用;
- 限于当前语法,需要重复写多处;
- 不光需要多处同步维护代码;
- 还会引起重复计算。
避免重复写代码
# 《重复写代码》
# 例子:把一个字符串中A后面的数字求和
s = "!@A1k222A6_78A8"
total, i = 0, -1
i = s.find("A", i + 1) # 找第一个A
while i >= 0:
total += int(s[i + 1])
i = s.find("A", i + 1) # 找下一个A
print(total)
赋值表达式写法
# 《避免重复写代码》
s = "!@A1k222A6_78A8"
total, i = 0, -1
while (i := s.find("A", i + 1)) >= 0:
total += int(s[i + 1])
print(total)
例子:连续输入命令行
while (exp := input("Exp:")).lower() != "bye":
print(exp, "=", eval(exp))
else:
print("Good Bye!")
避免重复计算
# 《重复计算》
def f(n): # 假设是一个耗时的函数
return sum([1/(i * i) for i in range(1, n + 1)])
# 输出f(i)+f(i)**0.5
for i in range(1, 10):
print(i, f(i) + f(i)**0.5)
改进版为
# 当然可以改进一下
# 输出f(i)+f(i)**0.5
for i in range(1, 10):
fi = f(i)
print(i, fi + fi**0.5)
赋值表达式写法
# 避免重复计算
# 输出f(i)+f(i)**0.5
for i in range(1, 10):
print(i, (fi := f(i)) + fi**0.5)
在推导式中应用
# 输出字符串列表中所有长度大于3的字符串及其长度
slist = ["Hello", "abc", "Python", "as", "world"]
print([(s, l) for s in slist if (l := len(s)) > 3])
例子:字典倒查
# 找到指定值对应的key
adic = {"Tom":34, "Yuki":55, "Bob":233}
v = 55
if any(adic[(found := k)] == v for k in adic): # any函数+生成器推导式
print("Found:", found)
else:
print("Not Found!")
标签:Python,0.5,重复,print,total,表达式,赋值
From: https://www.cnblogs.com/coco02/p/16882303.html