Python编程技巧 – 使用组合运算符

news2024/11/23 7:38:00

Python编程技巧 – 使用组合运算符

Python Programming Skills – Using Combined Operators

Python通过赋值过程,将声明变量与赋值和而为之,可谓讲求效率。此外,在Python赋值运算符里,也有一个强大高效的功能,即复合运算符。

在进行常规运算时,算术运算符就够用了;但是,面对复杂的运算和多行代码的较大程序,我们仍然希望写出简洁高效的代码。这时候,我们可能要使用组合运算符。

1. 组合运算符

在Windows命令行,启动Python程序,并进入交互式编程环境。来看几个例子:

>>> n = 10
>>> n = n + 1
>>> n
11
>>> n = n * 2
>>> n
22
>>> m = 10
>>> m += 1
>>> m
11
>>>
>>> m *= 2
>>> m
22

类似于n = n + 1之类的语句很普遍,类似于C/C++,在Python语言里,也可以进行简写形式。
例如,加减乘除取余,可用以下形式简写:

>>> x = 0
>>> x += 1
>>> x += 10
>>> x *= 2
>>>
>>> x -=3
>>> x /= 3
>>> x
6.333333333333333

但是,在算术运算中,存在优先级。例如,幂运算就优先于乘法、除法和余数运算,而优先级为2的运算高于加法和减法。因此,必要的时候,要按照优先级在特定位置添加括号,才能够得到所需的结果:

hypot = (a * a + b * b) ** 0.5

按照实际数字,hypot计算结果如下图所示:

>>> hypot = (3 * 3 + 4 * 4) ** 0.5
>>> hypot
5.0

2. 使用组合运算符

前面介绍过组合赋值运算符。请记住实例,即赋值符号(=)可以与以下任何运算符组合
+、-、*、/、%、、&、|、<<\、>>**

运算符&、|和^分别进行按位“与”、“或“和”异或“, 运算符<<和>>进行按位左移和按位右移。

  • 首先,任何赋值运算符的优先级都较低,通常在最后执行。
  • 其次,赋值运算符是否能就地修改,取决于被操作对象的类型是否可变。就地修改,是指对内存存储的数据进行操作,而不是创建对象。这样的操作更快且更加有效。

但是 ,赋值运算符与这些对象一起使用时不能够直接就地修改,必须产生一个新的对象,并将其重新赋值给变量。看下面的例子:

>>> s1 = s2 = "The string"
>>> s1 += "...has more details"
>>> print("s1:", s1)
s1: The string...has more details
>>> print("s2:", s2)
s2: The string

我们看到,当给s1赋值新的值时,它没有改变原字符串的数据,它为s1分配了一个新的字符串,但是s2是指源字符串数据的名称。这就是为什么s1, s2会指向不同的字符串。

除掉字符串,我们来看列表。由于列表是可变的,因此可以对列表进行就地赋值。

>>> lst1 = lst2 = [10, 15, 20]
>>> lst1 += [25, 30]
>>> print("lst1:", lst1)
lst1: [10, 15, 20, 25, 30]
>>> print("lst2:", lst2)
lst2: [10, 15, 20, 25, 30]

列表进行就地修改,就无需创建新列表并将列表重新分配给变量。Lst1还是指向原来的列表,因此,lst2(引用内存中相同数据的变量)也显示更改后的结果。

实际上,就地赋值更加高效。Python保留了一下额外空间以备列表增长,故Python允许append以及+=等操作高效的增长列表,但列表有时会超出保留空间,这时候就得删除超出部分。这种内存管理难以察觉,同时对程序行为几乎没有影响。

非就地操作效率低下,因为必须创建一个新对象。所以说,这就是为什么要使用 join 方法来创建大字符串,而不是用+=运算符的缘故。这一点对于关注性能方面尤为重要。

接下来,我们使用join() 方法创建列表,并将二十六个字母连接在一起。示例代码如下:

str = []
n = ord('a')
for i in range(n, n + 26):
    str += chr(i)
alphabet_str = ''.join(str)
print(alphabet_str)

执行结果如下图所示:

在这里插入图片描述
这里的str += chr(i),就是取i对应的字符并且累加到str字符串列表中,因此,+=又充当了一次角色,即组合加法运算。

从上面的例子不难看出,列表数据被追加到现有列表上,无须创建新列表并重新对变量赋值。

3. 小结

对组合运算符,我们可以小结如下:

1) 若对象是可变的(如列表),则组合赋值运算符(例如:+=)会对数据就地修改;否则,会创建一个新对象并赋给左侧的变量;
2) 就地运算速度更快,并可以更有效利用内存空间,正是由于它们不能强制创建新对象。对于列表,Python通常会分配额外的空间,以便在程序运行时更加高效地增长列表。这时候的列表,是个了不得的数据结构!

感谢阅读本文章。
技术好文陆续推出,敬请关注。

喜欢你就点赞哈!您的认可,我的动力!😃

相关阅读:

  1. Python编程技巧 - 异常处理
  2. Python编程技巧 - 迭代器(Iterator)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1305302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 神奇解码器:pyWhat 库全面指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在当今数字化的世界中&#xff0c;理解和处理文本数据是许多应用程序的关键任务。而PyWhat库作为一个用于处理文本的Python库&#xff0c;提供了强大的功能&#xff0c;帮助开发者在文本中识别和提取有意义的信息…

n-Track Studio Suite,音频录制与编辑的新纪元

在音乐制作领域&#xff0c;n-Track Studio Suite已经成为了音频录制和编辑的新标杆。这款软件将功能强大、操作简便和艺术创新完美融合&#xff0c;为用户提供了前所未有的音乐制作体验。 n-Track Studio Suite以其先进的音频处理技术&#xff0c;提供了精确的音频录制、编辑…

【从零开始学习JVM | 第三篇】类的生命周期(高频面试)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。 在本文中&#xff0c;我们将深入探讨类的生命周期&#xff0c;从类加载到…

VUE3语法--toRefs与toRef用法

1、功能概述 ref和reactive能够定义响应式的数据&#xff0c;当我们通过reactive定义了一个对象或者数组数据的时候&#xff0c;如果我们只希望这个对象或者数组中指定的数据响应&#xff0c;其他的不响应。这个时候我们就可以使用toRefs和toRef实现局部数据的响应。 toRefs是…

【探讨】bp神经网络是前馈还是后馈

目录 一、BP神经网络简介 1.1 什么是BP神经网络 1.2 BP神经网络的结构 二、BP神经网络的前馈与后馈 2.1 什么是BP神经网络的前馈 2.2 什么是BP神经网络的后馈 三、BP神经网络前馈与后馈的关系 3.1 BP神经网络前馈与后馈的区别 3.2 BP神经网络前馈与后馈的意义 四、BP…

论文阅读三——端到端的帧到凝视估计

论文阅读三——端到端的帧到凝视估计 主要内容研究问题文章的解题思路文章的主要结构 论文实验关于端到端凝视估计的数据集3种基线模型与EFE模型的对比在三个数据集中与SOTA进行比较 问题分析重要架构U-Net 基础知识 主要内容 文章从端到端的方法出发&#xff0c;提出了根据he…

Linux---虚拟机软件

1. 虚拟机软件的介绍 它是能够虚拟出来计算机的一个软件。 常用虚拟机软件: VmwareVirtualBox 说明: 只有安装了虚拟机软件才可以创建虚拟机&#xff0c;当然通过虚拟机软件还可以创建多个虚拟机。 2. 虚拟机的介绍 就是模拟一个真实的计算机&#xff0c;好比一个虚拟的…

Mybatis映射接口的动态代理实现原理

Mybatis映射接口的动态代理实现原理 在上一节中&#xff0c;我们介绍了MyBatis的核心配置文件加载流程&#xff0c;Mybatis核心配置文件加载流程详解 在文中&#xff0c;我们介绍了MyBatis在加载配置文件的过程中会针对每个接口类都生成一个相应的MapperProxyFactory动态代理工…

【异常解决】SpringBoot + Maven 在 idea 下启动报错 Unable to start embedded Tomcat(已解决)

Unable to start embedded Tomcat&#xff08;已解决&#xff09; 一、背景介绍二、原因分析2.1 网络上整理2.2 其他原因 三、解决方案 一、背景介绍 spring boot(v2.5.14) maven idea 启动项目 之前项目一直启动的好好的&#xff0c;都能正常运行。重启的时候突然就不能启…

单元测试技术

文章目录 一、单元测试快速入门二、单元测试断言三、Junit框架的常用注解 一、单元测试快速入门 所谓单元测试&#xff0c;就是针对最小的功能单元&#xff0c;编写测试代码对其进行正确性测试。 常规的例如如果在main中测试&#xff0c;比如说我们写了一个学生管理系统&…

MSPM0L1306例程学习-ADC部分(1)

MSPM0L1306例程学习-ADC部分(1) MSPM0L1306例程学习 使用的TI的官方例程&#xff0c;即SDK里边包含的例程代码。 MCU使用的是MSPM0L1306, 对于ADC部分&#xff0c;有10个例程&#xff1a; 例程理解 ADC的转换有多种工作模式&#xff0c;从最简单的单通道单次转换开始入手…

C++共享和保护——(1)作用域

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 人生就像骑单车&#xff0c;要想平衡就…

Java - Spring中Bean的循环依赖问题

什么是Bean的循环依赖 A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你&#xff0c;你也依赖我。 比如&#xff1a;丈夫类Husband&#xff0c;妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。 Spring解决循环依赖的机理 Spring为什么可以解决set s…

ubuntu如何远程ssh登录Windows环境并执行测试命令

ubuntu如何远程ssh登录Windows环境并执行测试命令 1 paramiko模块简介1.1 安装paramiko1.2 paramiko基本用法1.2.1 创建SSHClient实例1.2.2 设置主机密钥策略1.2.3 连接SSH服务器1.2.4 执行命令1.2.5 关闭SSH连接1.2.6 异常处理 2 windows的配置2.1 启动OpenSSH服务2.2 配置防火…

【Qt开发流程】之2D绘图1:概述及基本绘制与填充和渐变填充

概述 Qt的绘图系统可以使用相同的API在屏幕和打印设备上进行绘图&#xff0c;并且主要基于QPainter, QPaintDevice和QPaintEngine类。 QPainter用于执行绘图操作&#xff0c;QPaintDevice是一个二维空间的抽象&#xff0c;可以使用QPainter在其上绘制&#xff0c;QPaintEngine…

Android : XUI- SimpleImageBanner+BannerItem带标题的轮播图-简单应用

示例图&#xff1a; 1.导入XUI http://t.csdnimg.cn/qgGaN 2.MainActivity.java package com.example.viewpagerbanne;import android.os.Bundle; import android.view.View; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.xu…

vue项目中 CDN 是vue本身的依赖可以按需加载还是项目中所有的第三方库都可以按需加载?

这是我看到CDN简介时产生的问题 相信很多小伙伴会有 和我一样的疑问 在这里 我也统一回答一下 CDN&#xff08;内容分发网络&#xff09;是一种通过将数据分发到全球各个节点&#xff0c;以提供快速、可靠的内容传输的技术。在Vue项目中&#xff0c;CDN可以用于按需加载Vue本…

Linux--操作系统

1. 常见的操作系统 Windowsmac OSLinuxiOSAndroid 2. 操作系统的定义 操作系统直接运行在计算机上的系统软件&#xff0c; 它是控制硬件和支持软件运行的计算机程序。 3. 操作系统的作用 向下控制硬件向上支持软件的运行&#xff0c;具有承上启下的作用。 4.总结 操作系统…

Server check fail, please check server xxx.xxx.xxx.xxx,port 9848 is available

记录一次服务调用中的错误 背景&#xff1a;我使用了nacos2.x的版本&#xff0c;同时在同一台服务器的三个docker容器中部署了nacos1、2、3&#xff0c;并将它们连接到了同一个docker网络 错误&#xff1a;Server check fail, please check server xxx.xxx.xxx.xxx,port 9848 …

事件驱动架构 vs. RESTful架构:通信模式对比与选择

1. 通信风格 事件驱动架构&#xff08;EDA&#xff09; 是一种异步通信风格&#xff0c;组件之间通过产生和消费事件进行通信。 事件是表示系统中重大变化或事件的消息&#xff0c;并分发给感兴趣的组件。这种通信模型允许系统的不同部分之间进行解耦和动态交互。 组件充当事件…