返回顶部
首页 > 资讯 > 后端开发 > Python >Python中如何用海象操作符减少重复代码
  • 819
分享到

Python中如何用海象操作符减少重复代码

2023-06-15 15:06:17 819人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

本篇文章给大家分享的是有关python中如何用海象操作符减少重复代码,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。a = b是一条普通的赋值语句,读作a equals b,而a

本篇文章给大家分享的是有关python中如何用海象操作符减少重复代码,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

a = b是一条普通的赋值语句,读作a equals b,而a := b则是赋值表达式,读作a walrus b。这个符号为什么叫walrus呢?因为把:=顺时针旋转90°之后,冒号就是海象的一双眼睛,等号就是它的一对獠牙。

Python中如何用海象操作符减少重复代码

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

举个例子。如果有一筐新鲜水果要给果汁店做食材,那我们就可以这样定义其中的内容:

fresh_fruit = {     'apple': 10,     'banana': 8,     'lemon': 5, }

顾客点柠檬汁之前,我们先得确认现在还有没有柠檬可以榨汁。所以,要先查出柠檬的数量,然后用if语句判断它是不是非零的值。

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) if count:     make_lemonade(count) else:     out_of_stock()

这段代码看上去虽然简单,但还是显得有点儿松散,因为count变量虽然定义在整个if/else结构之上,然而只有if语句才会用到它,else块根本就不需要使用这个变量。所以,这种写法让人误以为count是个重要的变量,if和else都要用到它,但实际上并非如此。

我们在Python里面经常要先获取某个值,然后判断它是否非零,如果是就执行某段代码。对于这种用法,我们以前总是要通过各种技巧,来避免count这样的变量重复出现在代码之中,这些技巧有时会让代码变得比较难懂。Python引入赋值表达式正是为了解决这样的问题。下面改用海象操作符来写:

if count := fresh_fruit.get('lemon', 0):     make_lemonade(count) else:     out_of_stock()

新代码虽然只省了一行,但读起来却清晰很多,因为这种写法明确体现出count变量只与if块有关。这个赋值表达式先把:=右边的值赋给左边的count变量,然后对自身求值,也就是把变量的值当成整个表达式的值。

由于表达式紧跟着if,程序会根据它的值是否非零来决定该不该执行if块。这种先赋值再判断的做法,正是海象操作符想要表达的意思。

柠檬汁效力强,所以只需要一颗柠檬就能做完这份订单,这意味着程序只需判断非零即可。如果客人点的是苹果汁,那就至少得用四个苹果才行。按照传统的写法,要先从fresh_fruit这个字典里面查出苹果(apple)的数量(count),然后在if语句里,根据这个数量构造条件表达式(count  >= 4)。

def make_cider(count):     print(f'Making cider with {count} apples')  count = fresh_fruit.get('apple', 0) if count >= 4:     make_cider(count) else:     out_of_stock()

这段代码与刚才那个柠檬汁的例子一样,也过分突出了count变量的意义。下面改用海象操作符,把代码写得更清晰一些。

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

与刚才那个例子一样,修改之后的代码也比原来少了一行。但是这次,我们还要注意另外一个现象:赋值表达式本身是放在一对括号里面的。为什么要这样做呢?因为我们要在if语句里面把这个表达式的结果跟4这个值相比较。

刚才柠檬汁的例子没有加括号,因为那时只凭赋值表达式本身的值就能决定if/else的走向:只要表达式的值不是0,程序就进入if分支。但是这次不行,这次要把这个赋值表达式放在更大的表达式里面,所以必须用括号把它括起来。当然,在没有必要加括号的情况下,还是尽量别加括号比较好。

还有一种类似的逻辑也会出现刚才说的重复代码,这指的是:我们要根据情况给某个变量赋予不同的值,紧接着要用这个变量做参数来调用某个函数。

例如,若顾客要点香蕉冰沙,那我们首先得把香蕉切成好几份,然后用其中的两份来制作这道冰沙。如果不够两份,那就抛出香蕉不足(OutOfBananas)异常。下面用传统的写法实现这种逻辑:

def slice_bananas(count):     print(f'Slicing {count} bananas')     return count * 4  class OutOfBananas(Exception):     pass  def make_smoothies(count):     print(f'Making a smoothies with {count} banana slices')  pieces = 0 count = fresh_fruit.get('banana', 0) if count >= 2:     pieces = slice_bananas(count)  try:     smoothies = make_smoothies(pieces) except OutOfBananas:     out_of_stock()

还有一种传统的写法也很常见,就是把if/else结构上方那条pieces = 0的赋值语句移动到else块中。

count = fresh_fruit.get('banana', 0) if count >= 2:     pieces = slice_bananas(count) else:     pieces = 0  try:     smoothies = make_smoothies(pieces) except OutOfBananas:     out_of_stock()

这种写法看上去稍微有点儿怪,因为if与else这两个分支都给pieces变量定义了初始值。根据Python的作用域规则,这种分别定义变量初始值的写法是成立的。虽说成立,但这样写看起来比较别扭,所以很多人喜欢用第一种写法,也就是在进入if/else结构之前,先把pieces的初始值给设置好。

改用海象操作符来实现,可以少写一行代码,而且能够压低count变量的地位,让它只出现在if块里,这样我们就能更清楚地意识到pieces变量才是整段代码的重点。

pieces = 0 if (count := fresh_fruit.get('banana', 0)) >= 2:     pieces = slice_bananas(count)  try:     smoothies = make_smoothies(pieces) except OutOfBananas:     out_of_stock()

对于在if与else分支里面分别定义pieces变量的写法来说,海象操作符也能让代码变得清晰,因为这次不用再把count变量放到整个if/else块的上方了。

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结构。最接近这种结构的做法是在if/else结构里面继续嵌套if/else结构,或者使用if/elif/else结构。

例如,我们想按照一定的顺序自动给客人制作饮品,这样就不用点餐了。下面这段逻辑先判断能不能做香蕉冰沙,如果不能,就做苹果汁,还不行,就做柠檬汁:

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'

这种难看的写法其实在Python代码里特别常见。幸好现在有了海象操作符,让我们能够轻松地模拟出很接近switch/case的方案。

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新手还会遇到一个困难,就是缺少do/while循环结构。例如,我们要把新来的水果做成果汁并且装到瓶子里面,直到水果用完为止。下面先用普通的while循环来实现:

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 = [] 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()  print(bottles)

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

如果想复用这行代码,可以考虑loop-and-a-half  模式。这个模式虽然能消除重复,但是会让while循环看起来很笨,因为它成了无限循环,程序只能通过break语句跳出这个循环。

FRUIT_TO_PICK = [     {'apple': 1, 'banana': 3},     {'lemon': 2, 'lime': 5},     {'orange': 3, 'melon': 2}, ]  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)  print(bottles)

有了海象操作符,就不需要使用loop-and-a-half模式了,我们可以在每轮循环的开头给fresh_fruit变量赋值,并根据变量的值来决定要不要继续循环。这个写法简单易读,所以应该成为首选方案。

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)

在其他一些场合,赋值表达式也能缩减重复代码。总之,如果某个表达式或赋值操作多次出现在一组代码里面,那就可以考虑用赋值表达式把这段代码改得简单一些。

要点

  • 赋值表达式通过海象操作符(:=)给变量赋值,并且让这个值成为这条表达式的结果,于是,我们可以利用这项特性来缩减代码。

  • 如果赋值表达式是大表达式里的一部分,就得用一对括号把它括起来。

  • 虽说Python不支持switch/case与do/while结构,但可以利用赋值表达式清晰地模拟出这种逻辑。

以上就是Python中如何用海象操作符减少重复代码,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网Python频道。

--结束END--

本文标题: Python中如何用海象操作符减少重复代码

本文链接: https://lsjlt.com/news/280713.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python中如何用海象操作符减少重复代码
    本篇文章给大家分享的是有关Python中如何用海象操作符减少重复代码,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。a = b是一条普通的赋值语句,读作a equals b,而a...
    99+
    2023-06-15
  • 如何用Python代码减少Python所需的内存
    如何用Python代码减少Python所需的内存,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在执行程序时,如果内存中有大量活动的对象,就可能出现内存问题,尤其...
    99+
    2023-06-02
  • 如何使用js操作符优化代码
    这篇文章主要介绍“如何使用js操作符优化代码”,在日常操作中,相信很多人在如何使用js操作符优化代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用js操作符优化代码”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-27
  • C++中如何实现对象初始化操作代码
    这篇文章给大家分享的是有关C++中如何实现对象初始化操作代码的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。当对象在创建时获得了一个特定的值,我们说这个对象被初始化。初始化不是赋值,初始化的含义是创建变量赋予其一个...
    99+
    2023-06-22
  • 如何使用 Python 实现同步对象的重定向操作?
    同步对象是多线程编程中的重要概念,它可以帮助我们在多个线程之间同步数据,避免出现竞争条件。在 Python 中,常用的同步对象包括 Lock、Semaphore、Condition 等。本文将介绍如何使用 Python 实现同步对象的重定...
    99+
    2023-07-24
    重定向 对象 同步
  • Linux 中如何使用 Java 对象进行重定向操作?
    在Linux中,Java对象的重定向操作是非常常见的。重定向操作是将输出从一个文件描述符或一个命令重定向到另一个文件描述符或命令的过程。在Java中,我们可以使用System类的setOut方法来重定向输出流。 以下是如何在Linux中使用...
    99+
    2023-10-10
    重定向 linux 对象
  • 如何在Python中使用多继承解决复杂的代码重用问题
    如何在Python中使用多继承解决复杂的代码重用问题引言:在编写复杂的代码时,代码重用性是一个非常重要的因素。Python中的多继承是一种强大的工具,它允许一个类从多个父类继承属性和方法。在本文中,我们将介绍如何在Python中使用多继承来...
    99+
    2023-10-22
    Python 代码重用 多继承
  • 你知道如何在 Python 中使用 NumPy 操作文件对象吗?
    当今时代,数据处理和分析已经成为了各行各业中不可或缺的一部分。而 Python 语言中,NumPy 是一个非常重要的第三方库,它提供了一些高效的数组操作和数学函数,可以帮助我们更加方便地处理数据。在这篇文章中,我们将探讨如何在 Python...
    99+
    2023-11-04
    numy 文件 对象
  • PHP7中新增的空合并运算符:如何简化代码的判空操作?
    PHP7中新增的空合并运算符:如何简化代码的判空操作?在开发PHP应用程序时,经常会遇到需要判空的情况,例如获取用户输入的表单数据、从数据库查询结果中获取数据等等。以前的写法往往需要使用三元运算符或isset()函数来进行判断,代码看起来冗...
    99+
    2023-10-25
    PHP 简化代码 空合并运算符 判空操作
  • Java 中如何使用 Linux 系统进行重定向操作和对象传递?
    Linux 系统是一个广泛使用的操作系统,而 Java 作为一门跨平台的编程语言,也可以很好地与 Linux 系统进行交互。本文将介绍 Java 中如何使用 Linux 系统进行重定向操作和对象传递,并提供相应的演示代码。 一、重定向操作...
    99+
    2023-10-10
    重定向 linux 对象
  • 如何在Python中使用多继承实现代码复用
    如何在Python中使用多继承实现代码复用多继承是Python中一个强大且灵活的特性,可以帮助我们在编写代码时实现更高效的代码复用。本文将介绍如何在Python中使用多继承,并通过具体的代码示例来说明其使用方法。使用多继承的基本语法在Pyt...
    99+
    2023-10-22
    Python 代码复用 多继承
  • Python 对象和 NumPy:如何在数据分析中发挥重要作用?
    Python 是一种功能强大的编程语言,其使用范围广泛,包括数据分析、人工智能、Web 开发等领域。NumPy 是 Python 中的一种数据处理库,它提供了高效的多维数组操作以及用于科学计算的工具。本文将介绍 Python 对象和 Nu...
    99+
    2023-07-06
    对象 apache numy
  • 如何在Unix环境中使用Python对象来优化NumPy数组操作?
    NumPy是Python中用于科学计算的一个重要模块,它提供了高效的数组和矩阵运算功能。在处理大量数据时,NumPy的效率优势尤为明显。然而,NumPy的底层实现是基于C语言的,因此它的性能受到了一定的限制。在Unix环境下,我们可以使用...
    99+
    2023-07-01
    对象 unix numy
  • 在Ubuntu系统中如何使用Git客户端来操作GitHub代码
    这篇文章主要讲解了“在Ubuntu系统中如何使用Git客户端来操作GitHub代码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在Ubuntu系统中如何使用Git客户端来操作GitHub代码...
    99+
    2023-06-13
  • Python矩阵转置的实际应用操作方案及如何编写代码
    今天就跟大家聊聊有关Python矩阵转置的实际应用操作方案及如何编写代码,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。你需要确保该数组的行列数都是相同的.比如:arr =&...
    99+
    2023-06-17
  • 如何在Python中使用数组容器对象来提高代码效率?
    Python是一门高级编程语言,拥有很多强大的内置函数和数据结构,其中数组容器对象就是其中之一。数组容器对象可以帮助我们快速地处理大量数据,提高代码效率。在本文中,我们将讨论如何在Python中使用数组容器对象来提高代码效率。 一、什么是...
    99+
    2023-08-20
    数组 容器 对象
  • 如何使用Python中的HTTP文件重定向来优化你的代码?
    在Python编程中,HTTP文件重定向是一个非常重要的概念。HTTP文件重定向是指服务器返回一个指示客户端重定向到另一个URL的响应。这个过程可以帮助我们优化代码,提高运行效率,使得我们的程序更加健壮。 在本文中,我们将介绍HTTP文件...
    99+
    2023-08-27
    http 文件 重定向
  • Python中的数据类型:如何使用numpy对象来提高代码效率?
    Python是一门高级编程语言,它具有简单易学、面向对象、跨平台等特点,因此被广泛应用于数据科学、人工智能、Web开发等领域。在Python中,数据类型是编程中最基础的概念之一,掌握各种数据类型的使用方法可以极大地提高代码效率。而在所有的...
    99+
    2023-07-21
    数据类型 numy 对象
  • 如何在 Python 中使用缓存对象框架来提高您的代码效率?
    Python 是一种流行的编程语言,它的灵活性和易用性使其成为了很多开发人员的选择。但是,当涉及到大量数据处理时,Python 的速度可能会变慢,这是因为它是一种解释型语言。此时,使用缓存对象框架是提高Python代码效率的一个好方法。 本...
    99+
    2023-09-28
    缓存 对象 框架
  • 如何使用Python中的字符串操作函数处理大规模文本数据
    如何使用Python中的字符串操作函数处理大规模文本数据,需要具体代码示例随着互联网的快速发展和数据的不断增加,大规模文本数据处理成了现代科技中的一个重要课题。Python作为一门简单易学且功能强大的编程语言,提供了丰富的字符串操作函数,能...
    99+
    2023-10-22
    字符串操作 Python编程 大规模数据
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作