前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python90-10 海象运算符 :=

Python90-10 海象运算符 :=

作者头像
一只大鸽子
发布2022-12-06 09:27:43
5200
发布2022-12-06 09:27:43
举报
文章被收录于专栏:Python基础、进阶与实战

第10条:使用海象运算符

Item 10: Prevent Repetition with Assignment Expressions

Pyhton3.8 引入了海象(walrus)运算符:=。这是一种赋值判断运算符。赋值运算一般写作 a = b,而walrus运算写作 a := b。 它的用处就是它可以在不允许使用=的地方进行赋值,例如在if语句中。

注: 因为 :=旋转90度后看起来像海象的眼睛和象牙,所以叫做海象运算符

例如,我有一个果汁商店。下面是水果的数量。

代码语言:javascript
复制
fresh_fruit = {
    'apple': 10,
    'banana': 8,
    'lemon': 5,
}

顾客点柠檬汁,我们要确定是否有柠檬(True or False):使用海象表达式可以直接在if中赋值:

代码语言:javascript
复制
if count := fresh_fruit.get('lemon', 0):
    make_lemonade(count)
else:
    out_of_stock()

:= 首先对count赋值,然后将这个值作为表达式的值,也就是if语句的判断条件。

这两个步骤,赋值再判断(assign and the evaluate)就是海象表达式的含义。

继续下面的苹果汁例子。做苹果汁需要4个苹果,因此我们需要判断苹果数量是否>=4。

使用海象表达式:

代码语言:javascript
复制
if (count := fresh_fruit.get('apple', 0)) >= 4:
    make_cider(count)
else:
    out_of_stock()

另一种常见模式是根据条件赋值一个变量,后面使用该变量。例如,我要制作香蕉冰沙,需要两个香蕉切片。首先根据香蕉数量赋值切片数量,然后使用切片制作香蕉冰沙。

代码语言:javascript
复制
pieces = 0
if (count := fresh_fruit.get('banana', 0)) >= 2:
    pieces = slice_bananas(count)
try:
    smoothies = make_smoothies(pieces)
except OutOfBananas:
    out_of_stock()

或者:

代码语言:javascript
复制
if (count := fresh_fruit.get('banana', 0)) >= 2:
    pieces = slice_bananas(count)
else:
    pieces = 0
try:
    smoothies = make_smoothies(pieces)
except OutOfBananas:
    out_of_stock()

刚接触Python的程序员发现缺乏switch/case语句(Pyhon3.10已经有了类似的功能match/case)。近似的会使用多个if,elif,else嵌套。

代码语言:javascript
复制
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'

使用海象表达式进行修改:

代码语言:javascript
复制
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'

新手Python程序员可能发现Python没有do/while循环。

代码语言:javascript
复制
def pick_fruit():
    ...
def make_juice(fruit, count):
    ...
bottles = []
fresh_fruit = pick_fruit()
while fresh_fruit:
    for fruit, count in fresh_fruit.items():
        batch = make_juice(fruit, count)
        bottles.extend(batch)
    fresh_fruit = pick_fruit()

这有些重复,fresh_fruit = pick_fruit()语句分别在循环前和循环体内出现。改进的一种办法是使用下面的“半循环结构”(loop-and-a-half)。

代码语言:javascript
复制
bottles = []
while True:                     # Loop
    fresh_fruit = pick_fruit()
    if not fresh_fruit:         # And a half
        break
    for fruit, count in fresh_fruit.items():
        batch = make_juice(fruit, count)
        bottles.extend(batch)

使用赋值并判断的海象表达式可以解决这个问题。

代码语言:javascript
复制
bottles = []
while fresh_fruit := pick_fruit():
    for fruit, count in fresh_fruit.items():
        batch = make_juice(fruit, count)
        bottles.extend(batch)

通常, 当你发现在一组中多次重复相同的赋值时,就应该考虑使用海象表达式。

Things to Remember

  • • 赋值表达式(Assignment expressions)使用海象(walrus)操作符(:=)在单个表达式里完成对变量的赋值和求值,减少了重复。
  • • 当赋值表达式是更大的表达式一部分是,要用括号包起来。
  • • 尽管switch/case,do/while在Python中没有,但是可以用赋值表达式进行模拟。(Pyhton3.8没有switch/case,但是Python3.10已经有了match/case。)https://docs.python.org/zh-cn/3/tutorial/controlflow.html#match-statements)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一只大鸽子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第10条:使用海象运算符
  • Item 10: Prevent Repetition with Assignment Expressions
    • Things to Remember
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档