运算符 | 作用 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
// | 整除 |
% | 取余 |
** | 幂 |
# 例如
a = 2
b = 3
print(a+b)
print(a-b)
print(a*b)
print(a/b)
print(a//b)
print(a%b)
print(a**b)
print(a%b+(-a)%b)
# 终端显示
5
-1
6
0.6666666666666666
0
2
8
3 # a % b + (-a) % b = b
注意:
//取整数为向下取整,如果是2.6,则取2,如果是-2.6,则取-3;
%取余为被除数-除数*向下取整的商,的结果;
a % b + (-a) % b = b
比较运算符会返回Bool值,True或False
运算符 | 作用 |
---|---|
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
# 例如
a = 8
b = 99
c = 8
print(a > b)
print(a < b)
print(a >= b)
print(a <= c)
print(a == c)
print(a != c)
# 终端显示
False
True
False
True
True
False
运算符 | 意义 |
---|---|
= | 简单赋值 |
+= | 加法赋值 |
-= | 减法赋值 |
*= | 乘法赋值 |
/= | 除法赋值 |
%= | 取余赋值 |
//= | 取整赋值 |
**= | 幂赋值 |
:= | 海象运算符 |
一般情况下,增强运算符作用: |
# 例如
a = 2
b = 8
a += b # +=一般等价于a = a + b,其余类似
print(a)
# 终端显示
10
当需要在代码中写入一个变量,又不想单独拿出来用等号赋值,同时还要在该代码后续的代码中调用此变量时,可以用海象运算符;
# 例如
print(f'您今年{(age:= 20)}岁了') # (age:= 20)相当于单独拿出来age = 20,
print(f'您明年{age+1}岁了')
# 终端显示
您今年20岁了
您明年21岁了
注意: 海象运算符要记着加括号
# 例如
a, b = 1, 2 # 如果不带括号,系统自动封包,等价于a, b = (1, 2)
print(a, b)
a1, b1 = [3, 4]
print(a1, b1)
a2, b2 = '你好'
print(a2, b2)
[a3, b3] = 'ah' # 元组也一样
print(a3, b3)
a4, b4 = [7, 8, 9] # 元素数量不对等,会报错
print(a4, b4)
# 终端显示
1 2
3 4
你 好
a h
ValueError: too many values to unpack (expected 2)
# 例如
a = b = c = 9
print(a)
print(b)
print(c)
# 终端显示
9
9
9
+号可以对序列(字符串、列表、元组)进行操作,实现序列的拼接,*号可以实现元素的复制,但是要保证类型一致;
# 例如
a = [1, 2] # 列表
b = [3, 4]
c = a + b # 序列拼接
d = 3
res = a * d # *号后面需要接int,不能是序列
print(c)
print(res)
a1 = 'abc' # 字符串
b1 = 'def'
c1 = a1 + b1
d1 = 3
res1 = a1 * d1
print(c1)
print(res1)
a2 = ('abc', 0) # 元组
b2 = ('def', 1, 2)
c2 = a2 + b2
d2 = 3
res2 = a2 * d2
print(c2)
print(res2)
# 终端显示
[1, 2, 3, 4]
[1, 2, 1, 2, 1, 2]
abcdef
abcabcabc
('abc', 0, 'def', 1, 2)
('abc', 0, 'abc', 0, 'abc', 0)
同样的,+=和*=增强运算符也可以对序列进行操作,但是如果操作对象是可变类型,则会进行 inplace操作;
# 例如
tup1 = (1, 2)
tup2 = (3, 4)
res2 = tup1 # 此时res2与tup1引用同一地址
tup1 += tup2 # tup1引用到其他地方
print(tup1)
print(res2)
lis1 = [1, 2]
lis2 = [3, 4]
res = lis1 # 此时res2与lis1引用同一地址
lis1 += lis2 # 直接修改原数据,inplace
print(lis1)
print(res)
# 终端显示
(1, 2, 3, 4)
(1, 2)
[1, 2, 3, 4] # 结果发现+=是直接修改原数据,导致两个引用同一地址的变量均发生变化
[1, 2, 3, 4]
先对目标进行bool判断,然后返回值
运算符 | 名称 | 作用 | 在逻辑运算符中的优先级 |
---|---|---|---|
not | 非 | 目标为真,返回False,目标为假,返回True | 第一 |
and | 与 | 左边为假则返回左边,否则返回右边 | 第二 |
or | 或 | 左边为真则返回左边,否则返回右边 | 第三 |
# 例如
ex1 = ''
ex2 = 0
ex3 = False
ex4 = 'abc'
ex5 = 123
print(not ex1)
print(ex2 and ex4) # and左假右真输出左
print(ex4 and ex5) # and左真右真输出右
print(ex5 or ex3) # or左真右假输出左
print(ex1 or ex3) # or左真右真输出右
# 终端显示
True
0
123
123
False
优先级比较
# 例如
print(not 1 or 'False' and 789) #先算not,再算and,最后算or
# 终端显示
789
all(iterable):如果iterable全部为真,则返回True,否则返回False,iterable为空时,返回也为True;
any(iterable):如果iterable有一个为真,则返回True,否则返回False,iterable为空时,返回False;
# 例如
print(all(''))
print(all((1, 'abc', (45, 78))))
print(all((0, 'abc', (45, 78))))
print(any(''))
print(any((0, 'abc', (45, 78))))
print(any((0, False, None)))
# 终端显示
True
True
False
False
True
False
短路效应:如果前面的部分已经计算出整个表达式的结果,则后面的部分不再计算(当逻辑运算符一侧到的结果无论是什么都不影响整个语句的结果时,这一侧即使是问题语句,也不会报错);
# 例如
print(8 or 1 / 0 and 7) # or左侧8为真,故会直接输出8,后面1/0即使理论上有问题也不会报错;
# 终端显示
8
注意: False、None、0、空字符串、空列表、空元祖、空字典、空集合均会被认为是False
判断对象是否在目标中;返回bool值;
运算符 | 作用 |
---|---|
in | 在其中 |
not in | 不在其中 |
# 例如
res = 'ab'
res2 = 'absnlabhofna'
res3 = 8
res4 = [8, 'ab', [33, 44]]
res5 = 'c'
print(res in res2)
print(res2 in res4)
print(res3 not in res4)
print(res5 not in res4)
# 终端显示
True
False
False
True
判断两个标识符是否应用同一个对象(即判断其地址是否一致),返回Bool值;
运算符 | 作用 |
---|---|
is | 引用自同一个一个对象 |
is not | 不是引用自同一个一个对象 |
# 例如
a = 888
b = 888
c = a
print(id(a))
print(id(b))
print(id(c))
print(a is b)
print(a is c)
# 在交互式页面显示
1783319462448
1783319462224
1783319462448
False
True
把数字转换成二进制来计算;
bin(x):将10进制整数转换为2进制字符串,前缀0b
oct(x):将10进制整数转换为8进制字符串,前缀0o
hex(x):将10进制整数转换为16进制字符串,前缀0x
# 例如
print(type(bin(3)))
print(bin(3))
print(type(oct(3)))
print(oct(3))
print(type(hex(3)))
print(hex(3))
# 终端显示
<class 'str'>
0b11
<class 'str'>
0o3
<class 'str'>
0x3
不用函数时,2进制,8进制,16进制之间互相转换,可以用10进制作为中转,也可以根据2进制来互相转换,2进制的0001 0010转换成16进制的话,16是2的四次方,所以可以认为2进制中4位数代表16进制中1位数,因此0001 0010转换成16进制是12, 同理2进制到8进制可以认为3位数表示8进制一位数;
运算符 | 名称 | 作用 |
---|---|---|
& | 按位与 | 如果两个相应位都为1,则该位结果为1,否则为0 |
| | 按位或 | 两个相应位至少有一个1,则该位为1,否则为0 |
^ | 按位异或 | 只要两个相应位不同,结果就为1 |
~ | 按位取反 | 对每个二进制位(包括符号位)取相反,即1变0,0变1 |
<< | 左移 | 二进制向左移x位,右边补0 |
>> | 右移 | 二进制向右移x位,左边补相对应的符号位 |
在计算机中,二进制运算符最左端为符号位,正数的符号位是0,负数的符号位是1;
对于负数的运算,是以补码的形式存在的,即二进制原码→反码(即除符号位以外全部取反,0变1,1变0)→补码(即反码+1得到补码),对补码进行操作运算,如果结果仍为负数,则需一步步转换回去,即结果→(结果-1得到反码)→(除符号位外全部取反,得到原码);
正数的原码,反码,补码一致,故无需操作;
# 例如
a = -4 # 二进制1000 0100 , 反码1111 1011, 补码1111 1100
b = 8 # 二进制0000 1000 , 反码0000 1000, 补码0000 1000
print(a & b) #结果为0000 1000, 即为8
print(a | b) #结果为1111 1100, 反码1111 1011, 原码1000 0100, 即为-4
print(a ^ b) #结果为1111 0100, 反码1111 0011, 原码1000 1100, 即为-12
print(~ a) #结果为0000 0011, 反码0000 0011, 原码0000 0011, 即为3,
print(a <<2) #结果为1111 0000, 反码1110 1111,原码1001 0000, 即为-16
print(a >>2) #结果为1111 1111, 反码1111 1110, 原码 1110 0001, (左边三位是符号位)即为-1
# 终端显示
8
-4
-12
3
-16
-1
注意: 按位取反的时候,x→-(x+1)
# 例如
a = -4
b = 8
print(b >>7)
print(b >>8)
print(a >>7)
print(a >>8)
# 终端显示
0
0
-1
-1
注意:正数右移超过7位,结果为-1,负数右移超过7位,结果为0;
# 例如
a = -4
b = 8
c = a
a = b
b = c
print(a)
print(b)
# 终端显示
8
-4
# 例如
a = -4
b = 8
a, b = b, a
print(a)
print(b)
# 终端显示
8
-4
# 例如
a = -4
b = 8
a = a ^ b
b = a ^ b #结合上一句,此处可以理解为b = a ^ b ^ b等价于b = a
a = a ^ b #结合第一句,此处可以理解为a = a ^ b ^ b,但是此时b = a,因此可以等价于a = a ^ b ^ a,即a = b
print(a)
print(b)
# 终端显示
8
-4
运算符 | 意义 |
---|---|
** | 幂 |
~ | 按位取反 |
* / % // | 乘、除、取模、取整 |
+ - | 加、减 |
>> << | 右移、左移 |
& | 按位与 |
^ | | 按位异或、按位或 |
<= < > >= | 小于等于、小于、大于、大于等于(比较运算符) |
== != | 等于、不等于(等于运算符) |
%= /= //= -= += *= **= | 赋值运算符 |
is is not | 身份运算符 |
in not in | 成员运算符 |
not and or | 逻辑运算符 |