Python语法糖之赋值表达式


本博客主要参考为北京大学陈斌老师的下一站Python

image

概述

赋值表达式是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!")

:=和=

:=具备=的许多特性,但是不推荐改变编程习惯、弃用=。现在用的不是很多,等体验更丰富了再来更新。

posted @ 2022-11-11 22:46  Cisco_coco  阅读(129)  评论(0编辑  收藏  举报