• 海象赋值表达式减少重复变量


    海象赋值表达式减少重复变量

    1.概述

    在写代码过程中,定义局部变量操作频率非常高。如果在一个函数中定义了太多的变量会让程序不易维护且阅读起来困难。
    当我们在函数里面要定义变量时,而且这个变量要在函数里重复使用那么可以考虑使用海象赋值表达式减少创建变量。

    2.海象表达式介绍

    赋值表达式是python3.8新引入的语法,他会用到海象操作符。这种写法可以解决某些代码重复的问题。a=b是一条普通的赋值语句,读作a equals b;而a:=b则是赋值表达式,读作a walrus b。这个符号为什么叫walrus?因为把:=顺时针旋转90度后,冒号就像是海象的一双眼睛,等号就是他的一对獠牙。

    这种表达式很有用,可以在普通的赋值语句无法应用的场合实现赋值,例如用在if语句里面。赋值表达式的值,就是赋给海象操作符左侧那个标识符的值。

    2.1.海象表达式应用场景

    当我们需要定义一个局部变量时候,这个变量会被重复使用,这样的场景可以考虑使用海象赋值表达式能够让代码更紧凑,易读宜维护。

    1.用一个例子引出海象赋值表达式

    我们先来看一个简单的制作果汁的例子,当顾客购买柠檬汁之前,先判断有没有足够的柠檬可以榨汁。

    # 水果的数量放在字典中
    fresh_fruit = {
        'apple': 10,
        'banana': 8,
        'lemon': 5,
    }
    
    # 制作柠檬汁
    def make_lemonade(count):
        print(f'Making {count} lemons into lemonade')
    
    # 商店库存不足
    def out_of_stock():
        print('Out of stock!')
    
    # 获取柠檬的数量
    count = fresh_fruit.get('lemon', 0)
    # 如果柠檬不为0则制作柠檬汁
    if count:
        make_lemonade(count)
    else:
        out_of_stock()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    这段代码看上去非常的简单,但它不是好的代码,结构松散,因为count变量虽然定义在了if语句机构上面,但是只有if语句才会用到它,else块更本不需要使用这个变量。所以这种写法会让人误以为count是个很重要的变量,if和else都要用到它,然而实际上并非如此。

    我们的python开发过程中经常需要先获取某个值,然后对她做判断,在执行具体的逻辑。对于这种用法,我们需要先定义一个变量接收这个值,然后再操作这个变量,这样的代码总会创造出一些多余的变量。python引入赋值表达式就是为了解决这样的问题。

    2.海象赋值表达式优化代码结构

    优化后的代码虽然只省略了一行代码,但读起来结构却清晰很多,这种写法明确体现出count变量只与if语句有关
    这个赋值表达式先把:= 右边的赋值给左边的count变量,然后对自身求值。由于该语句紧跟着if语句,因此会判断它的值决定是否进入if语句体。这种操作就是海象赋值表达式要表达的意思。

    # 使用海象赋值表达式省去了定义count赋值语句。
    if count := fresh_fruit.get('lemon', 0):
    	# 在if语句中可以使用海象表达式创建的变量
        make_lemonade(count)
    else:
        out_of_stock()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    3.海象赋值表达式增加运算规则

    上面的柠檬只需要一个就可以制作柠檬汁,如果客人点了苹果汁,需要由4个苹果才能制作。下面在程序中新增制作苹果汁逻辑。

    if (count := fresh_fruit.get('apple', 0)) >= 4:
        make_cider(count)
    else:
        out_of_stock()
    
    • 1
    • 2
    • 3
    • 4

    这次需要注意赋值表达式放在了一对括号里面,为什么那?因为我们要在if语句里面把这个表达式的结果和4做比较。刚才柠檬汁的例子没有加括号,因为那时仅凭赋值表达式的值就能决定if/else的走向。

    4.嵌套if/else语句中使用海象操作符优化代码结构

    当判断的条件多了之后,那么最常见的写法就是使用if/else嵌套语句实现复杂的功能。但是随着嵌套的层级变多后,定义的变量语句也会变多,代码结构会比较混乱。因此我们可以使用海象赋值表达式来优化。

    假如现在我们做一个自动制作果汁流程,首先判断香蕉汁是否能做,如果不能就做苹果汁,还不行就做柠檬汁。先来看下常规的if/else写法

    # 获取香蕉数量,如果大于2则制作香蕉汁
    count = fresh_fruit.get('banana', 0)
    if count >= 2:
        pieces = slice_bananas(count)
        to_enjoy = make_smoothies(pieces)
    else:
    	# 不满足香蕉汁就只做苹果汁
        count = fresh_fruit.get('apple', 0)
        if count >= 4:
            to_enjoy = make_cider(count)
        # 如果上面的都不满足就制作柠檬汁
        else:
            count = fresh_fruit.get('lemon', 0)
            if count:
                to_enjoy = make_lemonade(count)
            else:
                to_enjoy = 'Nothing'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    下面使用海象操作符优化上面的代码

    if (count := fresh_fruit.get('banana', 0)) >= 2:
        pieces = slice_bananas(count)
        to_enjoy = make_smoothies(pieces)
    elif (count := fresh_fruit.get('apple', 0)) >= 4:
        to_enjoy = make_cider(count)
    elif count := fresh_fruit.get('lemon', 0):
        to_enjoy = make_lemonade(count)
    else:
        to_enjoy = 'Nothing'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    优化后的代码比原来的少了5行,但是看起来结构却清晰的多,因为嵌套深度与缩进层次数都变少了。
    只要碰到刚才难看的结构,就可以考虑使用海象操作符优化。

    5.while循环中使用海象操作符

    假如现在将所有的水果做成果汁放到瓶子里面,那么遍历查看所有的水果并将他们全部制作成果汁。

    下面的是常规的写法,这种写法必须把fresh_fruit = pick_fruit() 语句写两次,第一次是在while循环之前,因为我们要给fresh_fruit 设定初始值,第二次是在while循环体的末尾,因为我们得把下一轮需要处理的水果列表填充到fresh_fruit里面

    FRUIT_TO_PICK = [
        {'apple': 1, 'banana': 3},
        {'lemon': 2, 'lime': 5},
        {'orange': 3, 'melon': 2},
    ]
    
    # 选择水果
    def pick_fruit():
        if FRUIT_TO_PICK:
            return FRUIT_TO_PICK.pop(0)
        else:
            return []
    
    # 制作果汁
    def make_juice(fruit, count):
        return [(fruit, count)]
    
    bottles = []
    # 运行while前,调用pick_fruit()函数获取水果
    fresh_fruit = pick_fruit()
    # 遍历水果对象,水果名称:数量
    while fresh_fruit:
        for fruit, count in fresh_fruit.items():
            batch = make_juice(fruit, count)
            bottles.extend(batch)
        # 运行while过程中,再次调用pick_fruit()函数获取水果
        fresh_fruit = pick_fruit()
    
    print(f'制作好的果汁:{bottles}')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    使用海象操作符可以优化后的代码,while每次循环前都会获取新的水果,如果有水果则开始循环,没有则停止循环,实现了do-while循环模式。

    FRUIT_TO_PICK = [
        {'apple': 1, 'banana': 3},
        {'lemon': 2, 'lime': 5},
        {'orange': 3, 'melon': 2},
    ]
    
    bottles = []
    while fresh_fruit := pick_fruit():
        for fruit, count in fresh_fruit.items():
            batch = make_juice(fruit, count)
            bottles.extend(batch)
    
    print(bottles)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    windows下dapr的代码调试--非docker部署
    计算机系统(18)----- 进程互斥的软件实现方法
    linux-如何用起来ubuntu
    电机带宽的形象理解
    LeetCode-1106. 解析布尔表达式【栈,递归,字符串】
    八大排序详解
    【考研英语语法】介词 Preposition
    搜维尔科技:Xsens在现实生活中实时控制虚幻人形机器人
    vacuum full table释放表占用的空间
    738. 单调递增的数字
  • 原文地址:https://blog.csdn.net/m0_38039437/article/details/128150048