python从入门到入坑,python运算符(二)
1. python运算符
1.1 算数运算符: + - * / // % **
+ - * /
var1 = 5
var2 = 3
res = var1 - var2
res = var1 * var2
res = var1 / var2
res = var1 + var2
print(res)
/ 除法(结果永远是小数)
res = 8 / 4 #2.0
print(res,11111)
**// 地板除 ***** 实质是取商
被除数 ÷ 除数 = 商
res = 13 // 3 #4
如果被除数或者除数是小数,结果就是小数,在正常得到结果后带上.0
res = 13.0 // 3 #4.0
print(res)
% 取余
(1)3+(-4) = -1
(2)-3+4 = 1
(3)被除数和除数都是负数,结果直接取负
res = 7 % 4 # 3
res = 7 % -4 # -1
res = -7 % 4 # 1
res = -7 % -4 # -3
res = 81 % 7 # 4
res = -81 % 7 # 3 -4+7 = 3
res = 81 % -7 # -3 4+-7=-3
res = -81 % -7# -4
print(res)
res = 3 ** 4
print(res)
1.2 比较运算符: > < >= <= == !=
比较运算符最后的结果只有True或者False
res = 4 > 3 #True
res = 4 == 3 #False
res = 4 != 3 #True
print(res)
1.3 赋值运算符 = += -= *= /= //= %= **=
= 赋值运算符
先把等号右侧的数据算完在赋值给左侧的变量,从右往左看
a = 5
+= -=
var1 = 3
var2 = 4
var1 += var2
var1 = var1 + var2
print(var1) # 7
自增加1
var1 += 1 # var1 = var1 + 1
print(var1)
自增减一
var1 -= 1 # var1 = var1 - 1
print(var1)
**=
var1 = 100
var1 **= 2 # var1 = var1 ** 2
print(var1)
1.4 成员运算符: in 和 not in (针对于容器型数据)
特指容器 in 在..里面
str
#必须是连续的片段 ***
strvar = "5月26日,晚上7点有血月"
res = "晚" in strvar # True
res = "晚上" in strvar # True
res = "晚上血月" in strvar # False
print(res) # True
list/tuple/set
lst = ["张三","李四","王五","赵六","七八"]
tup = ("张三","李四","王五","赵六","七八")
setvar = {"张三","李四","王五","赵六","七八"}
res = "七八" not in lst
print(res) # False
res = "赵六" in tup
print(res) # True
res = "李四aa" in setvar
print(res) # False
dict
in 或者是 not in 用来判断字典的键,不是值
dic = {"why":"张三","sx":"李四","dyy":"赵六","ll":"七八"}
res = "张三" in dic
res = "why" in dic
print(res)
1.5 身份运算符 is / is not (判断地址)
1.5.1 整型而言 -5 ~ 正无穷
var1 = 200
var2 = 200
res = var1 is var2 #地址相同
print(res)
浮点型 非负数
var1 = -90
var2 = -90
res = var1 is var2 #地址不相同
print(res)
布尔型 相同即可
var1 = True
var2 = False
res = var1 is not var2 #返回True
print(res)
复数 实数+虚数 永不相同 (只有虚数情况下)
var1 = 3+4j
var2 = 3+4j
res = var1 is not var2 #返回True
print(res)
1.5.2 容器
相同的字符串 相同的空元组 地址相等 ***
var1 = "你好"
var2 = "你好"
print(var1 is var2)
var1 = ()
var2 = ()
print(var1 is var2)
**剩下的容器,地址都不一样 ** ***
var1 = [1,2,3]
var2 = [1,2,3]
print(var1 is not var2)
res = 5 == 5 #比较值的大小
res = 5 is 5 #比较值的地址
1.6 逻辑运算符
1.6.1 逻辑与 and
全真则真 一假则假
res = True and True # True
res = True and False # False
res = False and True # False
res = False and False# False
print(res)
1.6.2 逻辑或 or
**一真则真 全假则假 **
res = True or True # True
res = True or False # True
res = False or True # True
res = False or False# False
print(res)
1.6.3 逻辑非 not
真变假 假变真
res = not True
res = not False
print(res)
1.6.4 短路现象 ***
(1)True or 表达式
True or print(123)
无论后面的表达式是什么,改变不了最后的结果,于是短路
True or True => True
True or False => True
(2)False and 表达式
False and print(456)
无论后面的表达式是什么,改变不了最后的结果,于是短路
False and False => False
False and True => False
res = 5 or 6 #5
res = 5 and 6 #6
res = 0 and 7 #0
res = 0 or 6 #6
res = not 0
res = not 1
print(res)
执行过程:
1.先脑补5的布尔值是真还是假
2.是否出现了短路现象
3.如果是短路现象,返回前者
如果不是短路现象,返回后者
1.6.4 逻辑运算符的优先级
() > not > and > or
res = 5 or 6 and 7
print(res)
res = 5 or 7
res = 5
res = 5 and 6 or 7
print(res)
res = 6 or 7
res = 6
res = (5 or 6) and 7
print(res)
res = 5 and 7
res = 7
res = not (5 or 6) and 7
print(res)
res = not 5 and 7
res = False and 7
res = False
res = 1>2 and 3<4 or 5>7 and 5<1 or 1>2 and 34>89
print(res)
res = False and True or False and False or False and False
res = False or False or False
res = False or False
res= False
1.7 位运算符: & | ~ ^ << >>
var1 = 19 # 10011 二进制
var2 = 15 # 1111 二进制
1.7.1 & 按位与
res = var1 & var2
print(res) # 3
10011
1.7.2 按位或
res = var1 | var2
print(res)
10011
01111
-------
11111
1.7.3 ^ 按位异或
当两个值不一样时, 返回真 ***
res = var1 ^ var2
print(res)
真 ^ 假 = 真
假 ^ 真 = 真
真 ^ 真 = 假
假 ^ 假 = 假
10011
01111
-------
11100
1.7.4 << 左移
结论 : 任意数 << n => 任意数 * 2的n次幂
res = 5 << 1 # 10
res = 5 << 2 # 20
res = 5 << 3 # 40
print(res)
000 ... 101
000 ...1010 移动一位 10
000 ..10100 移动二位 20
000 .101000 移动三位 40
1.7.5 >> 右移
结论 : 任意数 >> n => 任意数 // 2的n次幂
res = 5 >> 1
res = 5 >> 2
res = 5 >> 3
print(res)
000 ... 101
000 ... 010 移动一位 2
000 ... 001 移动二位 1
000 ... 000 移动三位 0
1.7.6 ~ 按位非(了解)
公式: -(n+1)
res = ~-19
print(res)
按位非: ~ 对补码进行按位取反(每一位都取反)
反码: 除了第一个符号位,剩下每一位取反;
#正数的原码,反码,补码
#19
原码:000 ... 10011
反码:000 ... 10011
补码:000 ... 10011
补码:000 ... 10011
按位非:111 ... 01100
给你补码 求 原码
补码:111 ... 01100
反码:100 ... 10011
原码:100 ... 10100 => -20
负数的原码,反码,补码
#-19
原码:100 ... 10011
反码:111 ... 01100
补码:111 ... 01101
对补码运算
补码:111 ... 01101
按位非:000 ... 10010
给你补码 求 原码
补码:000 ... 10010
反码:000 ... 10010
原码:000 ... 10010 => 18
1.8 运算符总结:
**运算符优先级最高的: ****
运算符优先级最低的: =
整体来看: 一元运算符 > 二元运算符
一元运算符: 同一时间,操作一个数字 (-19 , ~19)
二运运算符: 同一时间,操作二个数字 (+ - * / ...) 3+5
具体来看:
算数运算符: 先算乘除 再算加减
逻辑运算符: () > not > and > or
位运算符 : (<< , >> ) > & > ^ > |
分布来看:
算数运算符 > 位运算符 > 比较运算符 > 身份运算符 > 成员运算符 > 逻辑运算符
赋值运算符用来收尾
res = 5+5<<10//5 is 40 or True and False
print(res)
res = 10 << 2 is 40 or True and False
res = 40 is 40 or True and False
res = True or True and False
res = True or False
res = True
套上括号
res = (5+5) << (10//5) is 40 or True and False
1.9 进制
intvar = 0xff
print(intvar)
print(intvar,type(intvar),id(intvar))
intvar = 100
print(intvar)
print(intvar,type(intvar),id(intvar))
# 二进制
intvar = 0b101
print(intvar)
print(intvar,type(intvar),id(intvar))