03. 运算符

一、运算符与表达式

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

二、算数运算符

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

算数运算符 运算 范例 结果
+ 5 + 2 7
- 5 - 2 3
* 5 * 2 10
/ 5 / 2 2.5
% 取模(取余) 5  % 2 1
// 取整除,返回商的整数部分 5 // 2 2
** 幂,即返回 x 的 n 次方 5**2 25,即 $ 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 = 25

a = "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
/= 除后赋值 a /= b 将 a / b 的值给 a
//= 整除后赋值 a //= b 将 a//b 的值给 a
%= 取余后赋值 a %= b 将 a % b 的值给 a
# 多个变量赋值时使用逗号分隔
a,b = 10,5

a += b
print("a = ",a)         # 15
print("b = ",b)         # 5
print()

a = 10
b = 5

a -= b
print("a = ",a)         # 5
print("b = ",b)         # 5
print()

a = 10
b = 5

a *= b
print("a = ",a)         # 50
print("b = ",b)         # 5
print()

a = 10
b = 5

a **= b
print("a = ",a)         # 100000
print("b = ",b)         # 5
print()

a = 10
b = 5

a /= b
print("a = ",a)         # 2.0
print("b = ",b)         # 5
print()

a = 10
b = 5

a //= b
print("a = ",a)         # 2
print("b = ",b)         # 5
print()

a = 10
b = 5

a %= b
print("a = ",a)         # 0
print("b = ",b)         # 5

四、关系运算符

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

关系运算符 运算 范例 结果
== 比较两个对象的值是否相等 4 == 3 False
!= 比较两个对象的值是否不相等 4 != 3 True
< 比较左侧值是否小于右侧值 4 < 3 False
> 比较左侧值是否大于右侧值 4 > 3 True
<= 比较左侧值是否小于等于右侧的值 4 <= 3 True
>= 比较左侧值是否大于等于右侧的值 4 >= 3 True
a = 4
b = 3

print(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))     # True

a = "1"
b = "2"
print(a, " < ", b, ": ", (a < b))       # True  

a = "abc"
b = "ab"
print(a, " > ", b, ": ", (a > b))       # True

a = 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 逻辑非,非假为真,非真为假

  运算结果:

a b a and b a or b not a
True True True True False
True False False True False
Flase True False True True
False False False False True
a = True
b = True
c = False
d = False

print(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 = -123

print("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为0 6 & 3 = 2
| 或运算,二进制位进行或运算,有1为1,全0为0 6| 3 = 7
^ 异或运算,二进制位进行异或运算,相同为0,不同为1 6 ^ 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 = 20

max = 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 > 大于 表达式 > 表达式 左到右 双目运算符
>= 大于等于 表达式 >= 表达式 双目运算符
< 小于 表达式 < 表达式 双目运算符
<= 小于等于 表达式 <= 表达式 双目运算符
== 等于 表达式 == 表达式 双目运算符
!= 不等于 表达式 != 表达式 双目运算符
is is 运算符 变量 is 变量 左到右 双目运算符
is not is not 运算符 变量 is not 变量 双目运算符
in in 运算符 元素 in 序列 左到右 双目运算符
not in not in 运算符 元素 not in 序列 双目运算符
12 not 逻辑非 not 表达式 左到右 单目运算符
13 and 逻辑与 表达式 and 表达式 左到右 单目运算符
14 or 逻辑与 表达式 and 表达式 左到右 单目运算符
15 if-else 三元表达式 语句1 if 条件表达式 else 语句2
16 = 赋值运算符 变量=表达式 右到左
/= 除后赋值 变量/=表达式
*= 乘后赋值 变量*=表达式
%= 取模后赋值 变量%=表达式
+= 加后赋值 变量+=表达式
-= 减后赋值 变量-=表达式
<<= 左移后赋值 变量<<=表达式
>>= 右移后赋值 变量>>=表达式
&= 按位与后赋值 变量&=表达式
^= 按位异或后赋值 变量^=表达式
|= 按位或后赋值 变量|=表达式
posted @ 2024-09-10 19:46  星光映梦  阅读(19)  评论(0编辑  收藏  举报