不管你是刚入坑的小白,还是天天秃头写Bug的老司机,写代码本质上就是在做两件事:存数据 和 算数据。
今天,我们就来盘一盘Python里的“算数据”神器——运算符。别以为这只是加减乘除,Python里的运算符可是自带黑科技的!准备好你的护发素,我们发车了!
算术运算符
算术运算符大家小学就学过,+ - * / 闭着眼都会。但在Python里,有几个“偏门”兄弟你需要认识一下:
- •
//整除(地板除):只要整数部分,小数统统砍掉! - •
**幂运算:x**y 就是 x 的 y 次方。(注意:这不是打马赛克,是求算力!)
print(10 // 3) # 输出: 3 (只要整数)print(10 % 3) # 输出: 1 (取余数)print(2 ** 3) # 输出: 8 (2的3次方)
比较运算符
写逻辑判断全靠它!返回值永远只有两个:True(真) 或 False(假)。
>, <, >=, <=, ==, !=
小白避坑指南:在Python里,一个等号 = 是用来赋值的,两个等号 == 才是用来判断相等的! 连写两个等号,才证明你真的在乎它俩平不平等!
赋值运算符
除了最基础的 =,Python还支持“偷懒写法”:
+=, -=, *=, /=, **=, //=, %=
x += 2 就等价于 x = x + 2。少敲几个键盘,多活几秒钟。
'''大家听过: 内存赋值,就是在内存中准备一个值, 然后让变量指向这地址。我们使用变量时,都是从内存取值 通过 id( var ) 得到 var 的值所在的内存地址Python 命令行运行时有个 最小整数池 机制, -5 ~ 256。公用相同内存中的数,但是在 pycharm内,有个大正数池大概在2的64次方左右'''e = 12306f = 12306# pycharm 内 大整数内存 也一致,因为 做了优化,有个 大整数池print('e', id(e))print('f', id(f))
逻辑运算符
如果说比较运算符是词语,那逻辑运算符就是连词:
- •
and (与):渣男定律。两边都得是True,结果才是True。一个False,立马翻脸(False)。 - •
or (或):海王定律。只要有一个是True,结果就是True。多线操作,稳赚不赔。 - •
not (非):杠精定律。你说是True,他非说是False。唱反调第一名。
print( a>5 and b>10 )print( a>5 or b>10 and c>5 and d<1 ) # 可连写
成员运算符
想知道某个元素在不在列表、字符串或字典里?用 in 和 not in,一秒查户口!
word = '天王盖地虎,宝塔镇河妖'print('王' in word) # True,天王也是王!# 字典的陷阱:字典只查键(Key),不查值(Value)!print('a' in {'a': 1, 'b': 2}) # Trueprint(1 in {'a': 1, 'b': 2}) # False
身份运算符
is 和 is not。有人问了:这跟 == 有啥区别?
- •
is 判断的是是不是同一个人(内存地址 id 是否相同)。
双胞胎长得一样(== 为 True),但身份证号不同(is 为 False)!
aa = 10bb = 10list2 = [2,3,4,10]list3 = [2,3,4,10]print(aa is bb)print(list2 is list3)print( aa is list2[-1] ) # True# 一样的list4 = list2list4[0] = 200print( list4 is list2)print(list2)# 从 原数据内 copy 一份,就会是另一个内存list5 = list2.copy()print(list5)list5[-1] = 1000print(list5)print(list2)
位运算符
前方高能!这里会将数字变成二进制来计算。虽然平时写业务很少用,但遇到神仙代码时能看懂,装X必备!包含:& (与), | (或), ^ (异或), ~ (取反), << (左移), >> (右移)。
| |
|---|
| 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 |
| 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 |
| |
| 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1 |
| 左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。 |
| 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数 |
'''----- 提一嘴 -----进制转换: 10 进制 变 其他进制bin( 十进制 ) 会返回 '0b二进制'oct( 十进制 ) 会返回 '0o八进制'hex( 十进制 ) 会返回 '0x十六进制'进制转换: 其他进制 变 10 进制 int('其他进制的字符串', 原来是几进制 ) 返回 10进制数 ,默认10进制如: int('11',16) int('0x11',16) 0b 0o 0x 进制标识可以省略'''print(bin(60))print(int('11'))print(int('0b11',2))# 现在用 60 和 13 做按位运算# 要现有 60(111100)与 13 (1101)的二进制print(60 & 13)print(60 | 13)
下面的**”过于高端“,只举例两点:**
取反~
~ 在python中为反转的意思, 目前我知道的有两种用法.
# 一. 数值按位翻转# ~ x 就是 - x - 1x = 2print(~x) # -3# 二. 布尔值取反# 在数据分析(Pandas)里,它经常客串 “布尔值反转”:# 想要删掉 DataFrame 里特定的几列?用 ~ 直接反选!# 翻译:留下那些 [不包含] 在 list1 里的列df = df[df.columns[~df.columns.isin(list1)]]
异或^
异或的性质
1、a ^ a=0 任何数字和自己异或结果是02、a ^ 0=a 任何数字和0异或还是他自己3、a ^ b = b ^ a 异或运算具有交换律4、a ^ (b ^ c) = (a ^ c) ^ b 异或运算具有结合律
# 示例1:值交换 # x=5 y=7将两个变量的值通过异或运算符进行交换x, y = 5, 7x = x ^ yy = x ^ yx = x ^ yprint(x, y)# 示例2:找出现一次的元素arr = [4, 1, 2, 1, 2]index = 0for i in arr: index ^= iprint(index)
运算符优先级:
当一堆运算符混在一起,谁先算谁后算?这就是优先级。不用死记硬背,大致规律是:算术 > 位运算 > 比较 > 逻辑。
这里有一份完整的“阶级图”(数字越大优先级越高):