当前位置: 首页 > news >正文

03. 运算符

一、运算符与表达式

  运算符 就是对字面量或者变量进行操作的符号;表达式 是指用运算符把字面量或者变量连接起来,符合 Python 语法的式子。不同运算符连接的表达式体现的是不同类型的表达式;Python 中的运算符主要包括 算术运算符赋值运算符比较(关系)运算符逻辑运算符位运算符

二、算数运算符

  算术运算符是用来处理四则运算的符号。

算数运算符运算范例结果
+5 + 27
-5 - 23
*5 * 210
/5 / 22.5
%取模(取余)5  % 21
//取整除,返回商的整数部分5 // 22
**幂,即返回 x 的 n 次方5**225,即 $ 5^{2}$
a = 5
b = 2
print(a, "+", b, "=", (a + b))      # 5 + 2 = 7
print(a, "+", b, "=", (a - b))      # 5 - 2 = 3
print(a, "+", b, "=", (a * b))      # 5 * 2 = 10
print(a, "+", b, "=", (a / b))      # 5 / 2 = 2.5
print(a, "+", b, "=", (a % b))      # 5 /% 2 = 1
print(a, "+", b, "=", (a // b))     # 5 // 2 = 2
print(a, "+", b, "=", (a ** b))     # 5 ** 2 = 25a = "hello"
b = "world"
print(a, b, "=", (a + b))           # hello + world = helloworld

在代码中,如果有小数参与运算,其结果可能是不精确的;

% 取模运算结果的正负与被模数一致,即:a%b 等价于 a-a/b*b,取模结果的正负与 a 的正负一致;

字符串之间也可以进行加法运算。如果将两个字符串相加,则会自动将两个字符串拼接为一个字符串;

如果将字符串和数字相乘,则会对字符串进行复制操作,即把字符串重复指定的次数并返回,例如:“字符串”*m,表示将字符串复制 m 次;

使用除法运算符(/ 或 //)和取余运算符时,除数不能为 0,否则会报以下异常:ZeroDivisionError: division by zero

三、赋值运算符

  赋值运算符 用于将右侧表达式的值赋值给左侧变量。

赋值运算符运算范例结果
=赋值a = 10将 10 赋值给变量a
+=加后赋值a += b将 a + b 的值给 a
-=减后赋值a -= b将 a - b 的值给 a
*=乘后赋值a *= b将 a * b 的值给 a
**=幂运算后赋值a **= b a b a^b ab 的值给 a
/=除后赋值a /= b将 a / b 的值给 a
//=整除后赋值a //= b将 a//b 的值给 a
%=取余后赋值a %= b将 a % b 的值给 a
# 多个变量赋值时使用逗号分隔
a,b = 10,5a += b
print("a = ",a)         # 15
print("b = ",b)         # 5
print()a = 10
b = 5a -= b
print("a = ",a)         # 5
print("b = ",b)         # 5
print()a = 10
b = 5a *= b
print("a = ",a)         # 50
print("b = ",b)         # 5
print()a = 10
b = 5a **= b
print("a = ",a)         # 100000
print("b = ",b)         # 5
print()a = 10
b = 5a /= b
print("a = ",a)         # 2.0
print("b = ",b)         # 5
print()a = 10
b = 5a //= b
print("a = ",a)         # 2
print("b = ",b)         # 5
print()a = 10
b = 5a %= b
print("a = ",a)         # 0
print("b = ",b)         # 5

四、关系运算符

  关系运算符 也被称为 比较运算符;它用于表达式的 比较,并返回一个 真值假值

关系运算符运算范例结果
==比较两个对象的值是否相等4 == 3False
!=比较两个对象的值是否不相等4 != 3True
<比较左侧值是否小于右侧值4 < 3False
>比较左侧值是否大于右侧值4 > 3True
<=比较左侧值是否小于等于右侧的值4 <= 3True
>=比较左侧值是否大于等于右侧的值4 >= 3True
a = 4
b = 3print(a, " == ", b, ": ", (a == b))     # False
print(a, " != ", b, ": ", (a != b))     # True
print(a, " <  ", b, ": ", (a < b))      # False
print(a, " <= ", b, ": ", (a <= b))     # False
print(a, " >  ", b, ": ", (a > b))      # True
print(a, " >= ", b, ": ", (a >= b))     # Truea = "1"
b = "2"
print(a, " < ", b, ": ", (a < b))       # True  a = "abc"
b = "ab"
print(a, " > ", b, ": ", (a > b))       # Truea = 1
b = True
print(a, " == ", b, ": ", (a == b))     # True

  在 Python 中,关系运算符可以连的使用。

result = 1 < 2 < 3	# 相当于 1 < 2 and 2 < 3
print(result)result = 10 < 20 > 15   # 相当于 10 < 20 and 20 > 15
print(result)

在 Python 中可以对字符串进行大于(等于)或小于(等于)的运算,当对字符串进行比较时,实际上比较的是字符串的 Unicode 编码,比较两个字符串的 Unicode 编码时,是逐位比较的;

如果不希望比较两个字符串的 Unicode 编码,则需要将其转换为数字然后进行再进行比较;

相等和不等比较的是对象的值,而不是 id

五、逻辑运算符

  逻辑运算符 用于根据表达式的值返回 真值假值。对于非布尔值进行逻辑运算,会将数据转换为布尔值,然后再进行逻辑运算。

  在 Python 中,所有的对象都可以进行真值测试,其中只有下面列出的几种情况得到的值为假。

  • False 或 None
  • 数值中的零,包括 0、0.0、虚数0
  • 空序列,包括 字符串、空元组、空列表、空字典
  • 自定义对象的实例,该对象的 __bool__ 方法返回 False 或者 __len__ 方法返回 0
逻辑运算符功能
and逻辑与,全真为真,有假为假
or逻辑或,有真为真,全假为假
not逻辑非,非假为真,非真为假

  运算结果:

aba and ba or bnot a
TrueTrueTrueTrueFalse
TrueFalseFalseTrueFalse
FlaseTrueFalseTrueTrue
FalseFalseFalseFalseTrue
a = True
b = True
c = False
d = Falseprint(a, " and ", b, ": ", (a and b))   # True
print(a, " and ", c, ": ", (a and c))   # False
print(c, " and ", d, ": ", (c and d))   # False
print()print(a, " or ", b, ": ", (a or b))     # True
print(a, " or ", c, ": ", (a or c))     # True
print(c, " or ", d, ": ", (c or d))     # False
print()print("not ", a, ": ", (not a))         # False
print("not ", c, ": ", (not c))         # True
print()# 对于非布尔值进行逻辑运算,会先将数据转化为布尔值,然后再进行逻辑运算
a = 1
print("not ", a, ": ", (not a))         # False

  在 Python 中 与运算 和 或运算 都具有短路效果,即当左边的表达式能确定最终结果时,那么右边就不会参与运算了;

  • 与运算符;与运算是找 False的,如果第一个值为 False,则不再看第二个值。
  • 或运算符:或运算是找 True 的,如果第一个值为 True,则不再看第二个值。
print("与运算的短路运算")
True and print("我执行了")
False and print("我不会执行")
print()print("或运算的短路运算")
True or print("我不会执行")
False or print("我执行了")

  当我们对非布尔值进行与或运算时,Python 会将其当作布尔值运算,最终会返回原值。与运算是找 False 的,如果第一个值是 False,则直接返回第一个值,否则返回第二个值。或运算是找 True 的,如果第一个值是 True,则直接返回第一个值,否则返回第二个值。

print("非布尔值的与运算")
# Ture and True
print("1 and 2: ", (1 and 2))        # 2
# True and False
print("1 and 0: ", (1 and 0))        # 0
# False and True
print("0 and 1: ", (0 and 1))        # 0
# False and False
print("0 and None: ", (0 and None))  # 0
print()print("非布尔值的或运算")
# Ture or True
print("1 or 2: ", (1 or 2))        # 1
# True or False
print("1 or 0: ", (1 or 0))        # 1
# False or True
print("0 or 1: ", (0 or 1))        # 1
# False or False
print("0 or None: ", (0 or None))  # None

六、身份运算符

身份运算符功能
is判断两个表示是否引用同一个对象,若引用的是同一个对象则返回 True,否则返回 False
is not判断两个表示是否引用同一个对象,若引用的不是同一个对象则返回 True,否则返回 False
a = 123
b = 123
c = -123
d = -123print("id(a): ",id(a))
print("id(b): ",id(b))
print("id(c): ",id(c))
print("id(d): ",id(d))
print(f"a = {a},b = {b},c = {c},d = {d}")
print()print("a is b: ", (a is b))             # True
print("a is c: ", (a is c))             # False
print()print("a is not b: ", (a is not b))     # False
print("a is not c: ", (a is not c))     # True
print()print("a is b: ",(a is b))
print("c is d: ",(c is d))

在 Python 解释器启动的那一刻开始,就会在内存中实现申请好一系列内存空间存放好常用的整数,范围为 [-5,256]。

如果用 Pycharm 等 IDE,会自动优化;

七、成员运算符

成员运算符功能
in在指定序列中找到值时返回 True,否则返回 False
not in在指定序列中没有找到值时返回 True,否则返回 False
a = "s"
b = "a"
c = "Sakura"print("a = ", a,", b  = ", b,", c = ", c)
print()print("a in c: ", (a in c))                 # False
print("a not in c: ", (a not in c))         # True
print()print("b in c: ", (b in c))                 # True
print("b not in c: ", (b not in c))         # False

八、位运算符

  位运算符是直接对整数的二进制进行的运算; 所有数字在计算机底层都以二进制形式执行;所有的整数值底层都以补码的方式存储;

  • 正数:三码合一,符号位为 0;
  • 负数:符号位为 1
    • 原码:直接将数值转成二进制数,最高位是符号位;
    • 反码:对原码按位取反,符号位不变;
    • 补码:其反码加 1;
位运算符运算范例
<<左移,空位补0,被移除的高位舍弃3 << 2 = 12
>>右移,空位使用符号位填充,被移除的低位舍弃3 >> 1 = 1
&与运算,二进制位进行与运算,全1为1,有0为06 & 3 = 2
|或运算,二进制位进行或运算,有1为1,全0为06| 3 = 7
^异或运算,二进制位进行异或运算,相同为0,不同为16 ^ 3 = 5
~按位取反,二进制位进行取反运算,非0为1,非1为0~6 = -7
print("3 << 2: ", (3 << 2))        # 12
print("3 >> 1: ", (3 >> 1))        # 1
print("-3 >> 1: ", (-3 >> 1))      # -2
print("6 & 3: ", (6 & 3))          # 2
print("6 | 3: ", (6 | 3))          # 7
print("6 ^ 3: ", (6 ^ 3))          # 5
print("~6: ", (~6))                # -7

<<:在一定范围内,每向左移一位,相当于乘以2;

>>:在一定范围内,每向右移一位,相当于除以2;

九、三元运算符

  三元运算符的格式如下:

语句1 if 条件表达式 else 语句2

  它的执行流程如下:

  • 条件运算符在执行时,会先对条件表达式进行求值判断
    • 如果判断结果为 True,则执行语句1,并返回执行结果
    • 如果判断结果为 False,则执行语句2,并返回执行结果
num = int(input("请输入一个数:"))
print("你输入的数比10大") if num > 10 else print("你输入的数不大于10")a = 10
b = 20max = a if a > b else b
print(max)

三元运算符一定可以改成 if-else 语句,反之不成立;

如果程序既可以使用三元运算符又可以使用 if-else 语句,优先使用三元运算符;

十、运算符的优先级

  我们可以使用小括号来提升运算符的优先级

优先级运算符名称或含义使用形式结合方向说明
1(expressions...)圆括号(表达式)左到右
[expressions...]列表[表达式]左到右
{key:value}字典{键:值}左到右
{expressions...}集合{表达式}左到右
2[index]索引[常量]左到右
[start:end:step]切片[起始索引:结束索引:步长]左到右
x(arguments...)方法调用方法名(形参列表)左到右
x.attribute属性访问对象.属性左到右
3**乘方表达式**表达式左到右
4+正号运算符+表达式右到左单目运算符
-负号运算符-表达式单目运算符
~按位取反~表达式左到右
5*表达式 * 表达式左到右双目运算符
/表达式 / 表达式双目运算符
//整除表达式 // 表达式双目运算符
%取余表达式 % 表达式双目运算符
6+表达式 + 表达式左到右双目运算符
-表达式 - 表达式双目运算符
7<<左移变量 << 表达式左到右双目运算符
>>右移变量 >> 表达式双目运算符
8&按位与表达式 & 表达式左到右双目运算符
9^按位异或表达式 ^ 表达式左到右双目运算符
10|按位或表达式 | 表达式左到右双目运算符
11>大于表达式 > 表达式左到右双目运算符
>=大于等于表达式 >= 表达式双目运算符
<小于表达式 < 表达式双目运算符
<=小于等于表达式 <= 表达式双目运算符
==等于表达式 == 表达式双目运算符
!=不等于表达式 != 表达式双目运算符
isis 运算符变量 is 变量左到右双目运算符
is notis not 运算符变量 is not 变量双目运算符
inin 运算符元素 in 序列左到右双目运算符
not innot in 运算符元素 not in 序列双目运算符
12not逻辑非not 表达式左到右单目运算符
13and逻辑与表达式 and 表达式左到右单目运算符
14or逻辑与表达式 and 表达式左到右单目运算符
15if-else三元表达式语句1 if 条件表达式 else 语句2
16=赋值运算符变量=表达式右到左
/=除后赋值变量/=表达式
*=乘后赋值变量*=表达式
%=取模后赋值变量%=表达式
+=加后赋值变量+=表达式
-=减后赋值变量-=表达式
<<=左移后赋值变量<<=表达式
>>=右移后赋值变量>>=表达式
&=按位与后赋值变量&=表达式
^=按位异或后赋值变量^=表达式
|=按位或后赋值变量|=表达式
http://www.lryc.cn/news/490143.html

相关文章:

  • 【最优清零方案——贪心+滑动窗口+线段树】
  • 一个点绕任意点旋转后的点的坐标
  • 大数据面试题每日练习--HDFS是如何工作的?
  • Python的3D可视化库 - vedo (2)visual子模块 基本可视化行为
  • Java AIO(NIO.2)
  • Flink 常用问题及常用配置(有用)
  • RocketMQ: 消息过滤,通信组件,服务发现
  • linux ubuntu的脚本知
  • HTTP有哪些风险?是怎么解决的?
  • 3.12MayBeSomeLinearAlgebra
  • 学习日志015--python单链表
  • 如何在Windows右键新建菜单中添加自定义项
  • Spring Boot 3.0废弃了JavaEE,改用了Jakarta EE
  • pdf文档动态插入文字水印,45度角,旋转倾斜,位于文档中央,多行水印可插入中文
  • [ 渗透测试面试篇-2 ] 针对大规模资产的攻击思路
  • 深入解析 Web 应用中的 CHIPS(Partitioned Cookie Attribute)
  • 从搭建uni-app+vue3工程开始
  • 归并排序与逆序对问题(C语言版)
  • 网络爬虫总结与未来方向
  • C++ 核心数据结构:Stack 与 Queue 类深度解析
  • Python枚举类详解:用enum模块高效管理常量数据
  • 企业OA管理系统:Spring Boot技术深度探索
  • 汽车免拆诊断案例 | 2012款路虎揽胜运动版柴油车加速无力
  • uniapp接入高德地图
  • (UI自动化测试)web自动化测试
  • 【es6进阶】如何使用Proxy实现自己的观察者模式
  • 住宅IP怎么在指纹浏览器设置运营矩阵账号
  • 表格数据处理中大语言模型的微调优化策略研究
  • CentOS7 如何查看kafka topic中的数据
  • VRRP实现出口网关设备冗余备份