• Python - PEP572: 海象运算符


    海象运算符

    • PEP572 的标题是「Assignment Expressions」,也就是「赋值表达式」,也叫做「命名表达式」
    • 不过它现在被广泛的别名是「海象运算符」(The Walrus Operator),因为:=很像海象

    赋值中间变量

    未使用海象运算符

    pattern = re.compile('s')
    data = 'ss'
    match = pattern.match(data)
    if match:
        print(match.group(0))

    使用海象运算符优化代码

    pattern = re.compile('s')
    data = 'ss'
    if match := pattern.match(data):
        print(match.group(0))

    使用海象运算符之后,分别做了四件事

    1. 对表达式pattern.match(data)求值
    2. 把第一步的求值结果赋值给 match 变量
    3. 把 match 变量作为 if 的 条件,判断它的值是不是 None
    4. 而 match 变量可以在 if 的作用域范围内继续使用 print(match.group(0)

    文件读取的例子

    未使用海象运算符

    while 1:
        line = fp.readline()
        if not line:
            break
        print(line)

    使用海象运算符优化代码

    while (line := fp.readline()):
        print(line)

    仍然做了四件事:

    1. 对表达式fp.readline()求值
    2. 求值结果赋值给 line
    3. 对 line 进行 while 循环的条件判断,如果 None 就退出循环
    4. line 变量可以在 while 循环体内使用

    这个就真的简化了很多的代码

    简化列表解析

    常见使用添加数据到列表的写法

    results = []
    for x in data:
        result = f(x)
        if result:
            results.append(result)

    假设想使用列表生成式来解决呢?

    results = [
        f(x) for x in data
        if f(x)
    ]

    这样是错误的,为什么?因为会执行两次f(x),不符合实际需求
    可以使用海象表达式来优化

    results = [
        y for x in data 
        if (y := f(x))
    ]

    官方例子

    stuff = [[y := f(x), x/y] for x in range(5)]

    因为每一项包含了 y,以及要用 y 才能获得结果 x/y,所以 赋值给中间变量是海象运算符的关键

    一段迷惑的使用海象操作符的代码


    __EOF__

  • 本文作者: 小菠萝测试笔记
  • 本文链接: https://www.cnblogs.com/poloyy/p/18136934
  • 关于博主: 阿里高级测开工程师 - 让我装回杯
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    在创建的关于tensorflow的envs环境中无法import出pip中显示的包
    文件数据交换格式说明
    直流有刷电机及Matlab/Simulink驱动仿真
    【Ubuntu】将多个python文件打包为.so文件
    9.Java面向对象基础(上)
    内网渗透(八十五)之ADCS证书服务攻击
    解决docker开启MySQL的binlog无法成功。docker内部报错:mysql: [ERROR] unknown variable
    双指针算法_移动零_
    你给我解释解释,什么TMD叫TMD attention(持续更新ing...)
    react-router-dom 版本6.18.0中NavLink的api和属性介绍
  • 原文地址:https://www.cnblogs.com/poloyy/p/18136934