【漫漫转码路】Python Day 07

运算符

一、算术运算符

运算符 作用
+
-
*
/
// 整除
% 取余
**
# 例如
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

三、赋值运算符

1、单目标赋值

运算符 意义
= 简单赋值
+= 加法赋值
-= 减法赋值
*= 乘法赋值
/= 除法赋值
%= 取余赋值
//= 取整赋值
**= 幂赋值
:= 海象运算符
一般情况下,增强运算符作用:
# 例如
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岁了

注意: 海象运算符要记着加括号

2、序列赋值

# 例如
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)

3、多目标赋值

# 例如
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

八、位运算符

把数字转换成二进制来计算;

1、进制转换

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进制一位数;

2、位运算符

运算符 名称 作用
& 按位与 如果两个相应位都为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;

3、a, b互换的三个方法

方法1:通过第三个变量来转换

# 例如
a = -4  
b = 8
c = a
a = b
b = c
print(a)
print(b)
# 终端显示
8
-4

方法2:利用多目标赋值

# 例如
a = -4  
b = 8
a, b = b, a
print(a)
print(b)
# 终端显示
8
-4

3、利用按位异或运算符^

# 例如
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 逻辑运算符

你可能感兴趣的:(转码,python,开发语言,人工智能)