python 运算符

1. 算数运算符 + - * / // % **

# 先定义两个变量
	var1 = 8
	var2 = 4
# 1. + 加法
	res = var1 + var2
	print(res)
# 2. - 减法
	res = var1 - var2
	print(res)
# 3. * 乘法
	res = var1 * var2
	print(res)
# 4. / 除法 (结果是小数)
	res = var1 / var2
	print(res)       # res = 2.0
# 5. // 地板除 (结果是整数)
	res = 10 // 2    # res = 5
	res = 7 // 4     # res = 1
	res = 11 // 4    # res = 2
	print(res)
# 如果被除数或者除数是一个小数,结果加上 .0
	res = 11.0 // 4  # res = 2.0
	print(res)
	
	res = 11.45 // 4 # res = 2.0
	print(res)
# 6. % 取余
	res = 11 % 4	# 3
	res = -11 % 4	# -3 + 4 = 1
	res = 11 % -4	# 3 + -4 = -1
	res = -11 % -4	# -3 (如果被除数和除数都是负数,在正常得到的结果前面加上负号即可)
	print(res)
	
	res = 18 % 8	# 2
	res = -18 % 8	# -2 + 8 = 6
	res = 18 % -8	# 2 + -8 = -6
	res = -18 % -8	# -2
	print(res)
# 7. ** 幂运算
	res = 4 ** 2
	res = 4 ** 100
	print(res)

2. 比较运算符 > < >= <= == !=

比较运算符只会产生两种结果: True 真的 False 假的

# 先定义两个变量
	var1 = 123
	var2 = 123
	
	res = var1 > var2	# False
	res = var1 < var2	# False
	res = var1 >= var2	# True
	res = var1 <= var2	# True
	print(res)
	
# 注意点
	res = var1 == var2	# True
	print(res)
    
	res = var1 != var2	# False
	print(res)

3. 赋值运算符 = += -= *= /= //= %= **=

# 先定义两个变量
	var1 = 8
	var2 = 3
# 1. = 等于 , 从右向左,将右侧的值赋值给左侧变量
	var1 = 8
# 2. += 加等于
	var1 += var2	# var1 = var1 + var2
	print(var1)
# 3. -= 减等于
	var1 -= var2	# var1 = var1 - var2
	print(var1)
# 4. *= 乘等于
	var1 *= var2	# var1 = var1 * var2
	print(var1)
# 5. /= 除等于
	var1 /= var2	# var1 = var1 / var2 
	print(var1)
# 6. //= 地板除等于
	var1 //= var2	# var1 = var1 // var2
	print(var1)
# 7. %= 取余等于
	var1 %= var2	# var1 = var1 % var2
	print(var1)
# 8. **= 幂运算等于
	var1 **= var2	# var1 = var1 ** var2
	print(var1)

4. 成员运算符 in 和 not in (针对于容器类型数据)

# 1. str 字符串
# 字符串必须是一个连续的片段
	strvar = "天上有朵雨做的云"
	res = "天" in strvar
	res = "下" not in strvar
	res = "雨做的云" in strvar
	res = "上雨云" in strvar	# False
	print(res)
# 2. list 列表 tuple 元组 set 集合
	lst = ["小明","小红","小东","小花"]
	res = "小花" in lst
	print(res)
	
	tup = ("小明","小红","小东","小花")
	res = "小路" not in tup
	print(res)
	
	setvar = {"大喷子","大棍子","大背头"}
	res = "大背头" in setvar
	print(res)
# 3. dict 字典
# in 和 not in 在字典中只判断键,不判断值
	dic = {"dpz":"巧舌如簧","dgz":"勇猛无比","dbt":"智勇双全"}
	res = "勇猛无比" in dic	# False
	res = "dgz" in dic 
	res = "dbt" not in dic
	print(res)

5. 身份运算符 is 和 is not

身份运算符: 检测两个数据在内存当中是否是同一个值

在python3.6版本中

1. Number 数字类型数据

# 1. int 整型 检测范围: -5 ~ 正无穷
	var1 = 123
	var2 = 123
	res = var1 is var2
	print(res)
# 2. float 浮点型 检测范围: 非负数
	var1 = -3.14
	var2 = -3.14
	res = var1 is not var2
	print(res)
# 3. bool 布尔型 值相同即可
	var1 = True
	var2 = True
	res = var1 is var2
	print(res)
# 4. complex 复数: 实数 + 虚数 (只有虚数的条件例外)
	var1 = 5-21j
	var2 = 5-21j
	res = var1 is var2
	print(res)

2. 容器类型数据

注意点: 相同的字符串和空元组,得到的结果相同,在内存当中是同一个值

容器类型数据的值永不相同,相同的字符串和空元组例外

var1 = (1,2,3,4)
	var2 = (1,2,3,4)
	res = var1 is var2
	print(res)

6. 逻辑运算符 and or not

1. 逻辑运算符的使用

# 1. and 逻辑与 : 全真则真,一假则假
	res = True and True    # True
	res = True and False   # False
	res = False and True   # False
	res = False and False  # False
	print(res)
# 2. or 逻辑或 : 全假则假,一真则真
	res = True or True     # True
	res = True or False    # True
	res = False or True    # True
	res = False or False   # False
	print(res)
# 3. not 逻辑非 : 真变假,假变真
	res = not True
	res = not False
	print(res)

2. 逻辑短路

逻辑短路: 如果出现了逻辑短路的情况,后面的代码不执行

  1. True or 表达式
    True or print(“小明真棒啊”)
    True or True => True
    True or False => True
  2. False and 表达式
    False and print(“小红真漂亮啊”)
    False and False => False
    False and True => False
  3. bool 类型为假的十种情况:
    0 , 0.0 , 0j , False , ‘’ , () , [] , set() , {}

3. 逻辑运算符的优先级

() > not > and > or

# 练习1
res = 5 or 6 and 7      # 5 or 7 => 5
res = (5 or 6) and 7    # 5 and 7 => 7
res = not(5 or 6) and 7 # not 5 and 7 => False and 7 => False
print(res)

# 练习2
res = 1>3 or 4<5 and 2>6 or 7<8 and 9>12 or 111<1111 and 11<12
# res = False or True and False or True and False or True and True
# res = False or False or False or True
# res = False or True
# res = True
print(res)

print(1>3 or 4<5 and 2>6 or 7<8 and 9>12 or 111<1111 and 11<12)

7. 位运算符 & | ^ << >> ~

# 1. 按位与 &
	var1 = 19
	var2 = 15
	print(var1 & var2)
"""
1 1 => 1
1 0 => 0
0 1 => 0
0 0 => 0
"""	
"""
19的二进制
0000 ... 10011
15的二进制
0000 ... 1111

计算过程:
0000 ... 10011
0000 ... 01111
0000 ... 00011 => 3
"""
# 2. 按位或 |
    var1 = 19
    var2 = 15
    print(var1 | var2)
"""
1 1 => 1
1 0 => 1
0 1 => 1
0 0 => 0
"""	    
"""
19的二进制
0000 ... 10011
15的二进制
0000 ... 01111

计算过程:
0000 ... 10011
0000 ... 01111
0000 ... 11111 => 31
"""    
# 3. 按位异或 ^ 两个值不一样,返回真,否则返回假
"""
1 0 => 1
1 1 => 0
0 0 => 0
0 1 => 1
"""
    var1 = 19
    var2 = 15
    print(var1 ^ var2)
"""
19的二进制
0000 ... 10011
15的二进制
0000 ... 01111

计算过程:
0000 ... 10011
0000 ... 01111
0000 ... 11100 => 28
"""        
# 4. 左移 << 左移相当于做乘法: a * 2 ** n
	res = 5 << 1 # 10
	res = 5 << 2 # 20
	res = 5 << 3 # 40
	print(res)
"""
5的二进制
0000 ... 101

0000 ... 101
0000 ... 1010   移动一位 10
0000 ... 10100  移动两位 20
"""	
# 5. 右移 >> 右移相当于做除法: a / 2 ** n
	res = 5 >> 1 # 2
	res = 5 >> 2 # 1
	res = 5 >> 3 # 0
	print(res)
"""
0000 ... 101
0000 ... 010  移动一位 2
0000 ... 001  移动二位 1
0000 ... 000  移动三位 0
"""	
# 6. 按位非 ~ (针对补码进行操作,按位取反,包括符号位)
"""公式: -(n+1)"""
	var1 = ~19
	print(var1)
"""
~ 按位非每一位都取反,包括符号位,求反码每一位除了符号位,都取反

19的二进制
0000 ... 10011

原码: 0000 ... 10011
反码: 0000 ... 10011
补码: 0000 ... 10011

补码:   0000 ... 10011
按位非: 1111 ... 01100

根据补码求原码:
补码: 1111 ... 01100
反码: 1000 ... 10011
原码: 1000 ... 10110 => -20
"""
	var1 = ~(-19)
	print(var1)
"""
-19的二进制
1000 ... 10011

原码: 1000 ... 10011
反码: 1111 ... 01100
补码: 1111 ... 01101

补码:   1111 ... 01101
按位非: 0000 ... 10010

根据补码求原码:
正数: 补码 = 反码 = 原码

原码: 0000 ... 10010 => 18
"""

8. 运算符总结

  1. 个别运算符:
    优先级最高 ** 幂运算
    优先级最低 = 赋值运算符
    () 括号可以提升运算优先级
  2. 整体 一元运算符 > 二元运算符
    一元运算符: 同一时间,只操作一个值 eg. - ~
    二元运算符: 同一时间,操作两个值 eg. + - * / …
  3. 同一层级
    逻辑运算符: () > not > and > or
    算数运算符: 乘除 > 加减
    位运算符 : ( << >> ) > & > ^ > |
  4. 其他运算符
    算数运算符 > 位运算符 > 比较运算符 > 身份运算符 > 成员运算符 > 逻辑运算符
    赋值运算符是最后算完进行赋值,做收尾工作
# 练习
	res = 5+5 << 6//3 is 40 and True
	print(res)
"""
res = 10 << 2 is 40 and True
res = 40 is 40 and True
res = True and True
res = True
"""	
# 加上括号包起来,让别人能看懂代码
	res = (5+5) << (6//3) is 40 and True