Python海象运算符(:=)的三种用法

【转载】:Python 海象运算符 := - 知乎

海象运算符

海象运算符的英文原名叫 Assignment Expresions ,即 赋值表达式。是Python 3.8新增的语法 :=,在 PEP 572 中提出。

海象运算符由一个 : 和 一个 = 组成,即 := 。因为它看起来就是一个海象旋转 90° 而成,很像海象的眼睛和长牙。可在表达式内部为变量赋值。

官网说明文档

Python 3.8 有什么新变化​docs.python.org/zh-cn/3/whatsnew/3.8.html

PEP 572 - Assignment Expressions​peps.python.org/pep-0572/

语法

海象运算符的语法格式是:

(variable_name := expression or value)

即一个变量名后跟一个表达式或者一个值,这个和赋值运算符 = 类似,可以看作是一种新的赋值运算符。

用法

1. 用于条件表达式

示例1:

a = 15
if a > 10:
    print('hello, walrus operator!')

海象运算符:

if a := 15 > 10:
    print('hello, walrus operator!')

示例2:

赋值表达式可以避免调用 len() 两次:

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)")

2. 用于 while 循环

(1)n 次循环的一般写法:

n = 5
while n:
    print('hello, walrus operator!')
    n -= 1

使用海象运算符

n = 5
while (n := n - 1) + 1: # 需要加1是因为执行输出前n就减1了
    print('hello, walrus operator!')

(2) 实现一个密码输入检验的一般写法:

while True:
    psw = input("请输入密码:")
    if psw == "123":
        break

更优雅的实现方式:海象运算符。

while (psw := input("请输入密码:")) != "123":
    continue

(3)读取一个文件的每一行并输出:

fp = open("test.txt", "r")
while True:
    line = fp.readline()
    if not line:
        break
    print(line.strip())
fp.close()

更简洁的实现:

fp = open("test.txt", "r")
while line := fp.readline():
    print(line.strip())

(4)适用于配合 while 循环计算一个值来检测循环是否终止,而同一个值又在循环体中再次被使用的情况:

# Loop over fixed length blocks 
while True:
    block = f.read(256)
    if block != '':
        process(block)
    else:
        break

使用海象运算符

# Loop over fixed length blocks 
while (block := f.read(256)) != '': 
    process(block)

3. 用于列表推导式

计算元素平方根,并保留平方根大于 5 的值:

nums = [16, 36, 49, 64]
def f(x):
    print('运行了函数f(x)1次。')
    return x ** 0.5
print([f(i) for i in nums if f(i) > 5])

以上执行后的输出为:

运行了函数f(x)1次。
运行了函数f(x)1次。
运行了函数f(x)1次。
运行了函数f(x)1次。
运行了函数f(x)1次。
运行了函数f(x)1次。
运行了函数f(x)1次。
[6.0, 7.0, 8.0]

一共就 4 个数字,但是函数被执行了 7 次。这是因为有三个数字满足列表推导式的条件,需要再额外计算 3次。当程序数据巨大的时候,这将浪费大量性能。

让我们来看看使用 := 的实现结果如何:

nums = [16, 36, 49, 64]
def f(x):
    print('运行了函数f(x)1次。')
    return x ** 0.5
print([n for i in nums if (n := f(i)) > 5])

执行后的输出:

运行了函数f(x)1次。
运行了函数f(x)1次。
运行了函数f(x)1次。
运行了函数f(x)1次。
[6.0, 7.0, 8.0]

函数只执行了 4 次,函数执行结果被 n 储存,不需要额外计算。性能优于不使用 := 的。

另一个值得介绍的用例出现于列表推导式中,在筛选条件中计算一个值,而同一个值又在表达式中需要被使用:

[clean_name.title() for name in names if (clean_name := normalize('NFC', name)) in allowed_names]

当然,海象运算符同样适合用于字典推导式和集合推导式。

4. 说明

在合适的场景中使用海象运算符可以降低程序复杂性,简化代码。一方面,可以写出优雅而简洁的 Python 代码;另一方面,可以看懂他人的代码。在一些实例中,甚至可以提高程序的性能。

不要为了使用海象运算符而使用!!!

请尽量将海象运算符的使用限制在清晰的场合中,以降低复杂性并提升可读性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值