一、运算符
1.什么是运算符:运算符是用于进行各种运算操作的符号或关键词。+ - *
比如:
-
4 + 5
,其中,4
和5
为操作数,+
为运算符。 -
a = 10
, 其中,a
和10
为操作数,=
为运算符。 -
print()
, 其中,print
为操作数,()
为运算符。
Python 语言常用运算符如下: - 算术运算符
- 比较(关系)运算符
- 赋值运算符
- 逻辑运算符
- 成员运算符
- 身份运算符
- 运算符优先级
这些运算符,根据使用操作数的不同,可分为: - 单目运算符
- 双目运算符
- 三目运算符
在每一门语言中,运算符都是非常简单,但是非常重要,非常难以熟练掌握和灵活应用的知识点。
二、算数运算符
1.在编写程序时,可以使用算术运算符来进行基本的数学计算。Python 中的算术运算符包括加法、减法、乘法、除法、取模和幂运算
|运算符|描述|
|—|—|
|+|加法 : 两个操作数相加|
|-|减法 : 两个操作数相减|
|*|乘法 : 两个操作数相乘|
|/|除法 : 两个操作数相除,结果为浮点数类型|
|%|取模 : 也称为求余运算符, 两个操作相除,取余数为计算结果|
|**|幂运算 :返回x的y次幂|
|//|整除 : 两个操作数相除,取商,结果为整数类型|
加法运算符(+)
加法运算符用于将两个数相加。
例如,a + b 表示将 a 和 b 相加的结果。 如果 a 和 b 都是数字,则加法运算符将执行数学加法操作。 如果 a 和 b 是字符串,则加法运算符将执行字符串连接操作。
a = 10
b = 20
c = a + b
print("a + b 的值为:", c)
s1 = "hello"
s2 = "hogwarts"
res = s1 + s2
print("字符串拼接结果为:", res)
减法运算符(-)
减法运算符用于将一个数减去另一个数。例如,a - b 表示将 b 从 a 中减去的结果。
a = 10
b = 20
c = a - b
print("a - b 的值为:", c)
乘法运算符(*)
乘法运算符用于将两个数相乘。例如,a * b 表示将 a 和 b 相乘的结果。
a = 10
b = 20
c = a * b
print("a * b 的值为:", c)
除法运算符(/)
除法运算符用于将一个数除以另一个数。例如,a / b 表示将 a 除以 b 的结果。需要注意的是,如果除数为 0,将会抛出异常。
在Python中,使用 /
进行除法运算时,会得到一个浮点数,如果需要整除运算需要使用 //
整除运算符
a = 10
b = 20
c = b / a
print("b / a 的值为:", c)
取模运算符(%)
取模运算符用于获取两个数相除的余数。例如,a % b 表示将 a 除以 b 的余数。
需要注意的是,取模运算本质上也是除法运算,如果除数为 0,将会抛出异常。
a = 10
b = 20
c = b % a
print("b % a 的值为:", c)
幂运算符(**
)
幂运算符用于获取一个数的指数幂。例如,a ** b 表示将 a 的 b 次方。
a = 2
b = 10
c = a ** b
print("a ** b 的值为:", c)
整除运算符(//)
整除运算符用于将一个数除以另一个数,该运算符会得到一个整数的商。
需要注意的是,如果除数为 0,也将会抛出异常。
a = 10
b = 20
c = b // a
print("b / a 的值为:", c)
三、赋值运算符
赋值运算符是使用 =
做为运算符号,将运算符左侧的数据或表达式的结果,保存到运算符左侧的标识符中。
在使用赋值运算符时,运算符右侧可以是任意类型的数据,但左侧必须是一个变量,否则会报错。
除普通的赋值运算符外,赋值运算符还可以和算术运算符组合成为复合赋值运算符。
Python 中提供的赋值运算符如下表所示:
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符 | c = a + b 将 a + b 的运算结果赋值为 c |
+= | 加法赋值运算符 | c += a 等效于 c = c + a |
-= | 减法赋值运算符 | c -= a 等效于 c = c - a |
*= | 乘法赋值运算符 | c *= a 等效于 c = c * a |
/= | 除法赋值运算符 | c /= a 等效于 c = c / a |
%= | 取模赋值运算符 | c %= a 等效于 c = c % a |
**= | 幂赋值运算符 | c **= a 等效于 c = c ** a |
//= | 取整除赋值运算符 | c //= a 等效于 c = c // a |
四、关系运算符 |
关系运算符
关系运算符也称为比较运算符,用来对参与运算的两个操作数进行比较,确认两个操作数之间的关系,运算结果会返回一个布尔值
Python 中提供的关系运算符如下表所示:
运算符 | 描述 |
---|---|
== | 等于 : 比较对象是否相等 |
!= | 不等于 : 比较两个对象是否不相等 |
> | 大于 : 返回x是否大于y |
< | 小于 : 返回x是否小于y |
>= | 大于等于 : 返回x是否大于等于y。 |
<= | 小于等于 : 返回x是否小于等于y。 |
五、逻辑运算符 |
逻辑运算符
逻辑运算符一般用来解决当有多个关系条件需要判断时使用,用来确定这些条件组合的方式,运算结果为布尔类型值。
Python 中提供的逻辑运算符如下表所示:
运算符 | 逻辑表达式 | 描述 |
---|---|---|
and | x and y | 逻辑"与" : 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 |
or | x or y | 逻辑"或" : 如果 x 是非 0,它返回 x 的计算值,否则它返回 y 的计算值。 |
not | not x | 逻辑"非" : 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 |
六、成员运算符 |
成员运算符
Python 提供了成员运算符,用于判断实例中是否包含了一系列的成员,包括字符串,列表或元组。
如下表所示:
运算符 | 描述 |
---|---|
in | 如果在指定的序列中找到值返回 True,否则返回 False。 |
not in | 如果在指定的序列中没有找到值返回 True,否则返回 False。 |
七、身份运算符 |
身份运算符
Python 中的身份运算符用来判断两个对象的引用是否为同一个,换言之,就是用来比较两个对象的内存地址是否相同。
Python 对数字和字符串做了一些优化以提高性能和减少内存开销。以下是 Python 对数字和字符串做的一些优化:
- 整数池(Integer Pool):Python 会在程序运行时预先创建一些整数对象,并将其保存在整数池中。这样,在创建整数对象时,可以重用已存在的对象,而不是创建新的对象。这在一定程度上减少了内存开销。
- 字符串池(String Pool):对于较短的字符串,Python 会使用字符串池进行优化。字符串池是一个缓存区,保存着所有共享相同内容的字符串对象。当创建新的字符串对象时,Python 会首先检查是否已经存在相同内容的字符串对象,如果存在,则直接重用已有的对象,避免重复创建新的对象。
因此,在某些情况下,字面量相同的两个对象,实际并不是同一个对象,此时如果需要区分对象的话,就需要使用身份运算符。
身份运算符如下表所示:
运算符 | 描述 |
---|---|
is | is 是判断两个标识符是不是引用自一个对象 |
is not | is not 是判断两个标识符是不是引用自不同对象 |
身份运算符 is
is
用来判断两个对象内存引用地址是否相同,如果相同,结果为真 True
,如果不相同,结果为假 False
# 示例 1
str1 = "Hello"
str2 = "Hello"
print(id(str1)) # 输出第一个字符串对象的内存地址
print(id(str2)) # 输出第二个字符串对象的内存地址
print(str1 == str2)
print(str1 is str2)
# 示例 2
str3 = "Hello, World!" * 1000
str4 = "Hello, World!" * 1000
print(id(str3)) # 输出第一个字符串对象的内存地址
print(id(str4)) # 输出第二个字符串对象的内存地址
print(str3 == str4)
print(str3 is str4)
注意:两个字面量相同的对象,内存地址未必相同,就像两个双胞胎,长的相同,但是是两个独立的个体。
身份运算符 is not
is not
用来判断两个对象内存引用地址是否不同,如果不同,结果为真 True
,如果相同,结果为假 False
# 示例 1
str1 = "Hello"
str2 = "Hello"
print(id(str1)) # 输出第一个字符串对象的内存地址
print(id(str2)) # 输出第二个字符串对象的内存地址
print(str1 == str2)
print(str1 is not str2)
# 示例 2
str3 = "Hello, World!" * 1000
str4 = "Hello, World!" * 1000
print(id(str3)) # 输出第一个字符串对象的内存地址
print(id(str4)) # 输出第二个字符串对象的内存地址
print(str3 == str4)
print(str3 is not str4)
is 和 == 的区别
在 Python 中,万物皆对象,而对象的三个基本要素:
- 内存地址
- 数据类型
- 值
而is
与==
都作为常用的判断语句去进行使用,这两者之间的主要区别是: -
==
运算符: 只比较两个对象的值,相同返回True
,不同返回False
。 -
is
运算符: 比较两个对象的id,相同返回True
,不同返回False
。
在这种场景下, 两个判断的执行结果均为True
。
a, b = 1,1
# 判断a,b 是否相等
print(a == b)
print(a is b)
在这种场景下, 两个判断的执行结果不一致。
a = [1,2,3]
b = [1,2,3]
# 对比值一致,返回True
print(a == b)
# 对比内存地址不一致,返回False
print(a is b)
八、三目运算符
三目运算符
三目运算符也称为三元运算符,是指运算符在使用时,需要有三个操作数参与计算。
Python 中也提供三目运算符,但语法上与传统的三目运算符并不相同。
可以将 Python 中的三目运算符理解成是 if-else
分支语句的简化单行模式
语法格式: [on_true] if [expression] else [on_false]
-
on_true
: 条件为真时的结果 -
on_false
: 条件为假时的结果 -
expression
: 判断条件
Python 会先判断expression
条件表达式的结果,如果条件为真,则结果为[on_true]
,条件为假,则结果为[on_false]
print("Yes" if True else "No")
print("Yes" if False else "No")
实际开发过程中,不建议使用三目运算符,相比较 if-else
结构的分支语句,三目运算符的可读性不高。
九、运算符优先级
运算符优先级
Python中的运算符非常丰富,但在使用过程中除了需要注意各自的特性外,不同的运算符也具有不同的优先级别。
Python 运算符优先级如下表所示:
运算符 | 描述 |
---|---|
(expressions…) | 绑定或加圆括号的表达式 |
[expressions…], {key: value…}, | 列表显示,字典显示,集合显示 |
x[index], x[index:index], x(arguments…), x.attribute | 抽取,切片,调用,属性引用 |
** | 乘方 5 |
+x, -x | 正,负 |
*, @, /, //, % | 乘,矩阵乘,除,整除,取余 6 |
+, - | 加和减 |
in, not in, is, is not, <, <=, >, >=, !=, == | 比较运算,包括成员检测和标识号检测 |
not | 布尔逻辑非 NOT |
and | 布尔逻辑与 AND |
or | 布尔逻辑或 OR |
if – else | 条件表达式 |
=, +=, -=, *=, /=, //=, **= | 赋值表达式 |
注意:因为位运算在后期课程使用过程中使用场景非常少,所以在本课程中并没有讲解(不代表在其它场景中不会使用)。
小技巧:如果在使用运算符的过程中,不能很好的掌握其优先级顺序,最简单的办法就是在需要先计算的表达式上加括号
print((2+3)*5)