跳至主要內容

运算符

Sankgao约 2356 字大约 8 分钟LanguagesPython

运算符

算数运算符

算术运算符用于组织整数类型和浮点类型的数据,有 一元运算符二元运算符 之分。

一元算术运算符有两个:+(正号)和 -(负号)。例如:+a 还是 a-a 是对 a 的取反运算。

二元算术运算符如下表所示:

算数运算符描述
++依次相加
--依次相减
+
-
*
/
%取余或(求模)
**指数或(幂)
//取整除

例如:

print(1 + 1)  # 输出结果:2

print(1 - 1)  # 输出结果:0

print(2 * 2)  # 输出结果:4

print(4 / 2)  # 输出结果:2.0

print(9 // 4)  # 输出结果:2

print(9 % 4)  # 输出结果:1

print(2 ** 4)  # 输出结果:16

print((1 + 2) * 3)  # 输出结果:9

赋值运算符

赋值运算符只是一种简写,只有算数和位运算符中的二元运算符才有对应的赋值运算符。

赋值运算符描述
=普通赋值
+=加赋值
-=减赋值
*=乘赋值
/=除赋值
%=取余赋值
**=幂赋值
//=整除赋值
&=位与赋值
|=位或赋值
^=位异赋值
<<=左移赋值
>>=右移赋值

例如:

# 单个变量赋值
num = 1

print(num)  # 输出结果:1

# 多个变量赋值
num1, float1, str1 = 10, 0.5, 'hello world'

print(num1)  # 输出结果:10
print(float1)  # 输出结果:0.5
print(str1)  # 输出结果:hello world

# 多变量赋相同值
a = b = 10

print(a)  # 输出结果:10
print(b)  # 输出结果:10

# 加赋值运算符
a = 100
a += 1  # a = a + 1

print(a)  # 输出结果:101

# 减赋值运算符
b = 100
b -= 1  # b = b - 1

print(b)  # 输出结果:99

# 乘赋值运算符
c = 100
c *= 2  # c = c * 2

print(c)  # 输出结果:200

# 除赋值运算符
d = 100
d /= 2  # d = d / 2

print(d)  # 输出结果:50.0

# 整除赋值运算符
e = 100
e //= 3  # e = e // 3

print(e)  # 输出结果:33

# 取余赋值运算符
f = 100
f %= 3  # f = f % 3

print(f)  # 输出结果:1

# 幂赋值运算符
g = 100
g **= 3  # g = g ** 3

print(g)  # 输出结果:1000000

# 先算复合赋值运算符右边的表达式,再算复合赋值运算
h = 100
h *= 1 + 2  # h = 100 * (1 + 2)

print(h)  # 输出结果:300

比较运算符

比较运算符用于比较两个表达式的大小,其结果是布尔类型的数据,即 TrueFalse

提示

比较运算符可用于任意类型的数据,但参与比较的两种类型的数据要相互兼容,即能进行隐式转换或显示转换

比较运算符描述
>大于
<小于
==等于
!=不等于
>=大于等于
<=小于等于
is两个对象地址(id)为同一个对象地址(id
is not两个对象地址(id)为不同对象地址(id

例如:

print(2 > 1)  # 输出结果:True。判断左边大于右边

print(1 < 2)  # 输出结果:True。判断左边小于右边

print(1 == 1)  # 输出结果:True。判断左边等于右边

print(1 != 2)  # 输出结果:True。判断左边不等于右边

print(2 >= 1)  # 输出结果:True。判断左边大于等于右边
print(2 >= 2)

print(1 <= 2)  # 输出结果:True。判断的左边小于等于右边
print(2 <= 2)

a = "hello"
b = "hello"
print(id(a))  # 输出结果:140506224367496
print(id(b))  # 输出结果:140506224367496
print(a is b)  # 输出结果:True

a = "hello world"
b = "hello world"
print(id(a))  # 输出结果:140506208811952
print(id(b))  # 输出结果:140506208812208
print(a is not b)  # 输出结果:True。交互环境跟 .py 文件结果是不一样的

逻辑运算符

逻辑运算符用于对布尔型变量进行运算,其结果也是布尔型

逻辑运算符作用
and逻辑与。如果两个语句都为真,则返回 True
or逻辑或。如果其中一个语句为真,则返回 True
not逻辑非。反转结果,如果结果为 true,则返回 False

例如:

print((1 < 2) and (2 > 1))  # 输出结果:True。逻辑与运算

print((1 < 2) or (1 > 2))  # 输出结果:True。逻辑或运算

print(not False)  # 输出结果:True。逻辑非运算,取反

数字之间逻辑运算:

# and 运算符,只要有一个值为 0,结果为 0,否则结果为最后一个非 0 数字
print(0 and 1)  # 输出结果:0
print(1 and 0)  # 输出结果:0
print(1 and 2)  # 输出结果:2
print(2 and 1)  # 输出结果:1

# or 运算符,只要所有值为 0,结果才为 0,否则结果为第一个非 0 数字
print(0 or 0)  # 输出结果:0
print(0 or 1)  # 输出结果:1
print(1 or 0)  # 输出结果:1
print(1 or 2)  # 输出结果:1
print(2 or 1)  # 输出结果:2

位运算符

位运算是以二进位(bit)为单位进行运算的,操作数和结果都是整数类型的数据。

位运算符描述
&位与:只有对应操作数位都是 1 时,结果位才是 1,否则为 0
|位或:只有对应操作数位都是 0 时,结果位才是 0,否则为 1
^位异:只有对应操作数位都是 0 或都是 1 时,结果位才是 0,否则位 1
~位反:将操作数中对应的二进制数 1 修改为 0;0 修改为 1
>>右移:将一个二进制操作数向右移动指定的位数,右边(低位端)溢出的位被丢弃,而在填充左边(高位端)的空位时,如果最高位是 0(正数),左侧空位填入 0;如果最高位是 1(负数),左侧空位填入 1。右移位运算相当于除以 2 的 n 次幂
<<左移:将一个二进制操作数向左移动指定的位数,左边(高位端)溢出的位被丢弃,右边(低位端)的空位用 0 补充。左移位运算相当于乘以 2 的 n 次幂

例如:

# &,位与
  0000 0000 0000 1100
& 0000 0000 0000 1000
-----------------------
  0000 0000 0000 1000

# |,位或
  0000 0000 0000 0110
| 0000 0000 0000 1010
-----------------------
  0000 0000 0000 1110

# ^,位异
  0000 0000 0001 1111
^ 0000 0000 0001 0110
-----------------------
  0000 0000 0000 1001

# ~,位反
~ 0000 0000 0111 1011
-----------------------
  1111 1111 1000 0100

# >> 右移
十进制:50  0000 0011 0010
十进制:25  0000 0001 1001  # 上面的向右移 1 位,右边最低位 0 丢弃,左边最高位添加 0
十进制:12  0000 0000 1100  # 上面的向右移 1 位,右边最低为 1 丢弃,左边最高位添加 0

# << 左移
十进制:96  0000 0110 0000
十进制:192 0000 1100 0000  # 上面的向左移 1 位,左边最高位 0 丢弃,右边最低位添加 0
十进制:384 0001 1000 0000  # 上面的向左移 1 位,左边最高位 0 丢弃,右边最低位添加 0

成员运算符

成员资格运算符用于测试序列是否在对象中出现。

运算符描述
in如果对象中存在具有指定值的序列,则返回 True
not in如果对象中不存在具有指定值的序列,则返回 True

运算符优先级

优先级高的运算先执行,优先级低的运算后执行,同一优先级的操作按照从左到右的顺序进行。

运算符优先级,由高到低,同一行的优先级相同,如下表所示:

运算符描述
()小括号
**
~位反
+-正负号
*/%//乘、除、取余、取整
+-加、减
<<>>左位移、右位移
&位与
^位异
|位或
<<=>>=!===比较
no逻辑非
anor逻辑与、逻辑或

转义字符

转义字符作用
\续行符
\n换行符
\0
\t水平制表符
"双引号
'单引号
\一个反斜杠
\f换页
\0dd八进制数,dd 代表字符。例如:\012 代表换行
\xhh十六进制数,hh 代表字符。例如:\x0a 代表换行
r/R在字符串定界符引号前面添加字母 rR,该字符串原样输出,其中的转义字符不进行转义

格式化输出

  • %d:整数
  • %s:字符串
  • %f:浮点数
  • %.2f:保留小数点后两位,不够的添加 0,多的去掉
  • %03d:指定整数为 3 位数,不够的在数字前面添加 0
  • f'{表达式}':格式化字符串常量

例如:

age = 18
name = 'TOM'
weight = 75.5
stu_id = 1

# %d 整数
print('今年我的年龄是 %d 岁' % age)  # 输出结果:今年我的年龄是 18 岁

# %s 字符串
print('我的名字是 %s' % name)  # 输出结果:我的名字是 TOM

# %f、%.2f 浮点数
print('我的体重是 %f 公斤' % weight)  # 输出结果:我的体重是 75.500000 公斤
print('我的体重是 %.2f 公斤' % weight)  # 输出结果:我的体重是 75.50 公斤

# %03d
print('我的学号是 %d' % stu_id)  # 输出结果:我的学号是 1
print('我的学号是 %03d' % stu_id)  # 输出结果:我的学号是 001

# 格式化输出多个字符
print('我的名字是 %s,今年 %d 岁了' % (name, age))  # 输出结果:我的名字是 TOM,今年 18 岁了

# 运行格式化输出字符进行运算
print('我的名字是 %s,明年 %d 岁了' % (name, age + 1))  # 输出结果:我的名字是 TOM,明年 19 岁了

# 格式化输出允许同一类型字符,注意顺序
print('我的名字是 %s,今年 %s 岁了,体重 %s 公斤' % (name, age, weight))  # 输出结果:我的名字是 TOM,今年 18 岁了,体重 75.5 公斤

# f'{表达式}'
print(f'我的名字是 {name},今年 {age} 岁了')  # 输出结果:我的名字是 TOM,今年 18 岁了