阅读时长18分钟 | 关键词Python运算符、算术运算、比较运算、逻辑运算、身份运算、运算符优先级引言运算符是代码的动词前面三篇文章我们搞定了 Python 的数据类型——数字、字符串、列表、元组、字典、集合。它们就像是语言中的名词用来描述是什么。但程序不能只描述是什么还得描述做什么。这就是运算符的作用——它们是代码中的动词用来表示对数据的操作。Python 提供了丰富的运算符可以分为以下几大类类别运算符作用算术运算符 - * / % ** //数学计算比较运算符 ! 比较大小返回布尔值赋值运算符 - * /等给变量赋值逻辑运算符and or not逻辑判断成员运算符in not in判断是否在容器中身份运算符is is not判断是否是同一个对象这篇文章会逐个讲解每一类运算符并深入一些容易被忽略的细节——比如和is的区别、逻辑运算符的短路机制、以及那些让你调试半天找不出原因的运算符优先级坑。一、算术运算符不只是加减乘除1.1 七种算术运算符a17b5print(ab)# 22 —— 加法print(a-b)# 12 —— 减法print(a*b)# 85 —— 乘法print(a/b)# 3.4 —— 除法结果总是浮点数print(a%b)# 2 —— 取模求余数print(a**b)# 1419857 —— 幂运算17的5次方print(a//b)# 3 —— 整除向下取整1.2/和//的区别 —— 很多人搞混# / 是普通除法结果总是 floatprint(10/3)# 3.3333333333333335print(10/2)# 5.0即使能整除也是浮点数# // 是整除地板除结果向下取整print(10//3)# 3print(-10//3)# -4注意-3.333... 向下取整是 -4不是 -3//的核心规则是向下取整不是去掉小数部分。对于正数来说两者一样但对于负数//会向更小的方向取整print(-10/3)# -3.333...print(-10//3)# -4 ← 向下取整比 -3.333 更小的是 -4# 如果你想要向零取整去掉小数部分用 int()print(int(-10/3))# -31.3%取模运算 —— 负数也有讲究print(10%3)# 1 —— 10 ÷ 3 3 余 1print(-10%3)# 2 —— 不是 -1print(10%-3)# -2print(-10%-3)# -1Python 的取模运算遵循公式a % b a - (a // b) * b。由于//是向下取整所以%的结果符号总是和除数一致。取模的实用场景# 判断奇偶num7ifnum%20:print(偶数)else:print(奇数)# 循环索引如轮播图items[A,B,C,D]foriinrange(10):print(items[i%len(items)])# A B C D A B C D A B# 取个位数print(12345%10)# 51.4**幂运算print(2**10)# 1024print(4**0.5)# 2.0 —— 开平方print(8**(1/3))# 2.0 —— 开立方# 和内置函数 pow() 等价print(pow(2,10))# 1024print(pow(2,10,1000))# 24 —— pow(a, b, mod) 相当于 (a**b) % mod效率更高二、比较运算符返回布尔值的判断比较运算符用于判断两个值之间的大小关系结果总是布尔值True或False。运算符含义示例结果等于5 5True!不等于5 ! 3True大于5 3True小于5 3False大于等于5 5True小于等于5 3Falsea456b456c789print(ab)# Trueprint(a!c)# Trueprint(ca)# Trueprint(bc)# Trueprint(ab)# Trueprint(ab)# True2.1 链式比较 —— Python 的特色语法Python 支持链式比较这在很多其他语言中是不允许的x5# 传统写法大多数语言ifx0andx10:print(x 在 0 和 10 之间)# Python 链式比较更优雅if0x10:print(x 在 0 和 10 之间)# 更多例子age25if18age60:print(劳动年龄人口)# 实际上是等价于 (18 age) and (age 60)2.2vsis—— 一个让无数人掉坑的区别这是面试高频考点也是实际开发中的常见 Bug 来源# 比较的是值是否相等a[1,2,3]b[1,2,3]print(ab)# True —— 值相等# is 比较的是否是同一个对象内存地址是否相同print(aisb)# False —— 两个不同的列表对象# 数字的小整数缓存机制x256y256print(xisy)# True —— Python 缓存了 -5 到 256 的整数x257y257print(xisy)# False —— 超出缓存范围创建了两个不同的对象黄金规则比较值是否相等 → 用比较是否是同一个对象→ 用is和None比较时 → 用is None这是 Python 社区约定# ✅ 正确ifresultisNone:print(没有结果)# ❌ 不推荐虽然功能上没问题ifresultNone:print(没有结果)三、赋值运算符不只是3.1 基本赋值# 简单赋值a10# 多目标赋值多个变量指向同一个对象abc999print(id(a),id(b),id(c))# 三个 id 相同# ⚠️ 可变对象的多目标赋值有风险abc[1,2,3]b.append(4)print(a)# [1, 2, 3, 4] —— a 也被改了print(b)# [1, 2, 3, 4]print(c)# [1, 2, 3, 4]3.2 序列解包赋值# 基本解包a,b3,4# a3, b4a,b,c[3,4,5]# a3, b4, c5# 字符串解包a,b,c,d你好吗?# a你, b好, c吗, d?# 元素数量必须匹配# a, b [1, 2, 3] # ValueError: too many values to unpack# 用 * 接收剩余元素a,*b,chelloprint(a)# hprint(b)# [e, l, l] —— 中间的被收集到列表print(c)# o# 用 _ 忽略不需要的值_,*mid,_[1,2,3,4,5]print(mid)# [2, 3, 4]3.3 增强赋值运算符增强赋值也叫复合赋值将运算和赋值合二为一a3a2# 等价于 a a 2 → 5a-2# 等价于 a a - 2 → 3a*2# 等价于 a a * 2 → 6a/2# 等价于 a a / 2 → 3.0a%2# 等价于 a a % 2 → 1.0a**3# 等价于 a a ** 3 → 1.0a//0.5# 等价于 a a // 0.5 → 2.0增强赋值的隐藏特性inplace 操作对于可变对象增强赋值会原地修改而普通赋值会创建新对象# 增强赋值原地修改lst1[1,2]print(f修改前 id:{id(lst1)})# 4378524352lst1[3,4]print(f修改后 id:{id(lst1)})# 4378524352 —— 相同原地修改print(lst1)# [1, 2, 3, 4]# 普通赋值 ... ...创建新对象lst1[1,2]print(f修改前 id:{id(lst1)})# 4378518832lst1lst1[3,4]print(f修改后 id:{id(lst1)})# 4378524352 —— 不同新对象print(lst1)# [1, 2, 3, 4]这个区别在函数参数传递时尤为重要——如果传入一个列表并用修改外部也会受影响。四、和*的拼接操作和*不仅用于数字还支持字符串、列表、元组的拼接# 字符串拼接 s1Hello s2Worldprint(s1s2)# Hello Worldprint(s1*3)# Hello Hello Hello # 列表拼接 lst1[1,2]lst2[3,4,5]print(lst1lst2)# [1, 2, 3, 4, 5]print(lst1*3)# [1, 2, 1, 2, 1, 2]# 元组拼接 tup1(1,2)tup2(3,4,5)print(tup1tup2)# (1, 2, 3, 4, 5)print(tup1*3)# (1, 2, 1, 2, 1, 2)注意不同类型的序列不能直接拼接。# [1, 2] (3, 4) # TypeError! 列表不能和元组拼接五、逻辑运算符and、or、not5.1 基本规则# and两边都为 True 才返回 True但返回的不是 True/False# or至少一边为 True 就返回 True# not取反返回 True 或 False关键点Python 的and和or返回的是对象本身不是布尔值5.2 and 的返回值规则a and b如果bool(a)为False返回a否则返回b。print(0and2)# 0 —— 0 是 falsy返回 0print([]and2)# [] —— 空列表是 falsy返回 []print(3and0)# 0 —— 3 是 truthy返回第二个值 0print(3and5)# 5 —— 3 是 truthy返回第二个值 5print(helloand2)# 2 —— hello 是 truthy返回第二个值 25.3 or 的返回值规则a or b如果bool(a)为True返回a否则返回b。print(2or0)# 2 —— 2 是 truthy直接返回 2print([]or2)# 2 —— [] 是 falsy返回第二个值 2print(0or[])# [] —— 0 是 falsy返回第二个值 []print(helloor2)# hello —— hello 是 truthy直接返回 hello5.4 not 的返回值规则not始终返回True或Falseprint(not2)# Falseprint(not0)# Trueprint(not[])# Trueprint(nothello)# False5.5 短路机制 —— 这是一个重要特性and和or都具有**短路short-circuit**特性如果能从左边确定最终结果右边就不会被执行。# and 的短路左边为 falsy 时右边不执行a0print(aand1/0)# 0 —— 1/0 没有执行否则会报 ZeroDivisionError# or 的短路左边为 truthy 时右边不执行b1print(bor1/0)# 1 —— 1/0 没有执行# 实际应用安全访问dataNoneresultdataanddata[key]# None不会报错# 等价于ifdata:resultdata[key]else:resultdata5.6 all() 和 any() —— 批量逻辑判断# all()所有元素都为 truthy → Trueprint(all([1,2,3]))# Trueprint(all([1,0,3]))# False0 是 falsyprint(all([]))# True —— 空的可迭代对象返回 True# any()至少一个元素为 truthy → Trueprint(any([0,,None]))# False全是 falsyprint(any([0,,1]))# True1 是 truthyprint(any([]))# False —— 空的可迭代对象返回 False注意all([])返回Trueany([])返回False。这是数学逻辑中的空真vacuous truth原则。5.7 逻辑运算符优先级not and or这是固定的优先级顺序# 不加括号not and orprint(TrueandnotFalseorFalse)# True# 实际执行顺序 (True and (not False)) or False# (True and True) or False# True or False# True建议逻辑复杂时加括号比依赖优先级更清晰# 清晰if(age18andhas_id)oris_vip:print(可以进入)# 不清晰虽然结果一样但需要思考优先级ifage18andhas_idoris_vip:print(可以进入)六、成员运算符in 和 not in成员运算符用于判断一个值是否在可迭代对象中# 字符串 shello worldprint(eins)# Trueprint(loins)# True —— 子串也可以print(olnotins)# True# 列表 lst[1,2,3,4]print(2inlst)# Trueprint(5notinlst)# True# 字典判断的是 key不是 valued{name:小明,age:25}print(nameind)# True —— 判断 keyprint(小明ind)# False —— 不判断 valueprint(25ind.values())# True —— 要判断 value用 .values()成员检查的效率对于列表是 O(n)需要逐个遍历对于字典和集合是 O(1)基于哈希表。七、身份运算符is 和 is not# is判断两个变量是否引用同一个对象id 相同# is not判断两个变量是否引用不同的对象a[1,2,3]b[1,2,3]caprint(aisb)# False —— 值相同但不是同一个对象print(aisc)# True —— c 就是 aprint(aisnotb)# Trueis的典型使用场景# 1. 判断是否为 None最常用ifresultisNone:print(没有结果)# 2. 判断是否为特定单例对象iftype(x)isint:print(x 是整数)# 注意不要用 is 比较数字和字符串的值# 小整数缓存只是 CPython 的实现细节不应依赖八、运算符优先级一张表搞定当一行代码中有多个运算符时Python 按照优先级从高到低执行。以下是常用运算符的优先级排序优先级高→低运算符描述1最高**指数2x -x ~x正号、负号、按位取反3* / % //乘、除、取模、整除4 -加法、减法5 位移6按位与7^按位异或8|按位或9 比较10 !等于、不等于11 % / // - * **赋值最低12is is not身份13in not in成员14not逻辑非15and逻辑与16最低or逻辑或记忆口诀算术 比较 身份/成员 逻辑 赋值。有疑问时加括号是最安全的做法。# 不加括号难读resultab*cdandeorf# 加括号一目了然result((a(b*c))d)andeorf九、动手练习练习 1运算符综合计算# 请心算以下表达式的值然后运行验证a10b3print(a//ba%b)# ?print(a**b-b**a)# ?print(not(abandb0))# ?练习 2增强赋值的原地修改陷阱defadd_item(lst,item):lstlst[item]# 这是创建新列表print(f函数内部:{lst})my_list[1,2,3]add_item(my_list,4)print(f函数外部:{my_list})# 还是 [1, 2, 3]# 改为 lst [item] 再试试看练习 3短路机制实战# 不用 if 语句用短路机制实现默认值nameinput(请输入姓名直接回车跳过: )or匿名用户print(f你好{name})# 思考为什么 input 返回空字符串时or 会生效小结这篇文章覆盖了 Python 的七类运算符。核心要点类别关键点常见坑算术//是向下取整不是去小数-10 // 3 -4不是-3比较比值is比对象小整数缓存-5~256赋值对可变对象是原地修改多目标赋值可变对象共享引用逻辑and/or返回对象本身有短路混淆and/or和/|成员字典判断的是 key小明 in {name:小明}→ False身份is None是判断 None 的标准写法不要用is比较数字值下一篇文章我们将进入条件语句——if/elif/else、三元表达式、条件嵌套看看 Python 如何优雅地实现分支逻辑。本文是「Python从入门到数据分析」系列的第 4 篇共 24 篇。关注我不错过后续更新。
【Python系列课程】Python运算符与表达式:从加减乘除到优先级陷阱
阅读时长18分钟 | 关键词Python运算符、算术运算、比较运算、逻辑运算、身份运算、运算符优先级引言运算符是代码的动词前面三篇文章我们搞定了 Python 的数据类型——数字、字符串、列表、元组、字典、集合。它们就像是语言中的名词用来描述是什么。但程序不能只描述是什么还得描述做什么。这就是运算符的作用——它们是代码中的动词用来表示对数据的操作。Python 提供了丰富的运算符可以分为以下几大类类别运算符作用算术运算符 - * / % ** //数学计算比较运算符 ! 比较大小返回布尔值赋值运算符 - * /等给变量赋值逻辑运算符and or not逻辑判断成员运算符in not in判断是否在容器中身份运算符is is not判断是否是同一个对象这篇文章会逐个讲解每一类运算符并深入一些容易被忽略的细节——比如和is的区别、逻辑运算符的短路机制、以及那些让你调试半天找不出原因的运算符优先级坑。一、算术运算符不只是加减乘除1.1 七种算术运算符a17b5print(ab)# 22 —— 加法print(a-b)# 12 —— 减法print(a*b)# 85 —— 乘法print(a/b)# 3.4 —— 除法结果总是浮点数print(a%b)# 2 —— 取模求余数print(a**b)# 1419857 —— 幂运算17的5次方print(a//b)# 3 —— 整除向下取整1.2/和//的区别 —— 很多人搞混# / 是普通除法结果总是 floatprint(10/3)# 3.3333333333333335print(10/2)# 5.0即使能整除也是浮点数# // 是整除地板除结果向下取整print(10//3)# 3print(-10//3)# -4注意-3.333... 向下取整是 -4不是 -3//的核心规则是向下取整不是去掉小数部分。对于正数来说两者一样但对于负数//会向更小的方向取整print(-10/3)# -3.333...print(-10//3)# -4 ← 向下取整比 -3.333 更小的是 -4# 如果你想要向零取整去掉小数部分用 int()print(int(-10/3))# -31.3%取模运算 —— 负数也有讲究print(10%3)# 1 —— 10 ÷ 3 3 余 1print(-10%3)# 2 —— 不是 -1print(10%-3)# -2print(-10%-3)# -1Python 的取模运算遵循公式a % b a - (a // b) * b。由于//是向下取整所以%的结果符号总是和除数一致。取模的实用场景# 判断奇偶num7ifnum%20:print(偶数)else:print(奇数)# 循环索引如轮播图items[A,B,C,D]foriinrange(10):print(items[i%len(items)])# A B C D A B C D A B# 取个位数print(12345%10)# 51.4**幂运算print(2**10)# 1024print(4**0.5)# 2.0 —— 开平方print(8**(1/3))# 2.0 —— 开立方# 和内置函数 pow() 等价print(pow(2,10))# 1024print(pow(2,10,1000))# 24 —— pow(a, b, mod) 相当于 (a**b) % mod效率更高二、比较运算符返回布尔值的判断比较运算符用于判断两个值之间的大小关系结果总是布尔值True或False。运算符含义示例结果等于5 5True!不等于5 ! 3True大于5 3True小于5 3False大于等于5 5True小于等于5 3Falsea456b456c789print(ab)# Trueprint(a!c)# Trueprint(ca)# Trueprint(bc)# Trueprint(ab)# Trueprint(ab)# True2.1 链式比较 —— Python 的特色语法Python 支持链式比较这在很多其他语言中是不允许的x5# 传统写法大多数语言ifx0andx10:print(x 在 0 和 10 之间)# Python 链式比较更优雅if0x10:print(x 在 0 和 10 之间)# 更多例子age25if18age60:print(劳动年龄人口)# 实际上是等价于 (18 age) and (age 60)2.2vsis—— 一个让无数人掉坑的区别这是面试高频考点也是实际开发中的常见 Bug 来源# 比较的是值是否相等a[1,2,3]b[1,2,3]print(ab)# True —— 值相等# is 比较的是否是同一个对象内存地址是否相同print(aisb)# False —— 两个不同的列表对象# 数字的小整数缓存机制x256y256print(xisy)# True —— Python 缓存了 -5 到 256 的整数x257y257print(xisy)# False —— 超出缓存范围创建了两个不同的对象黄金规则比较值是否相等 → 用比较是否是同一个对象→ 用is和None比较时 → 用is None这是 Python 社区约定# ✅ 正确ifresultisNone:print(没有结果)# ❌ 不推荐虽然功能上没问题ifresultNone:print(没有结果)三、赋值运算符不只是3.1 基本赋值# 简单赋值a10# 多目标赋值多个变量指向同一个对象abc999print(id(a),id(b),id(c))# 三个 id 相同# ⚠️ 可变对象的多目标赋值有风险abc[1,2,3]b.append(4)print(a)# [1, 2, 3, 4] —— a 也被改了print(b)# [1, 2, 3, 4]print(c)# [1, 2, 3, 4]3.2 序列解包赋值# 基本解包a,b3,4# a3, b4a,b,c[3,4,5]# a3, b4, c5# 字符串解包a,b,c,d你好吗?# a你, b好, c吗, d?# 元素数量必须匹配# a, b [1, 2, 3] # ValueError: too many values to unpack# 用 * 接收剩余元素a,*b,chelloprint(a)# hprint(b)# [e, l, l] —— 中间的被收集到列表print(c)# o# 用 _ 忽略不需要的值_,*mid,_[1,2,3,4,5]print(mid)# [2, 3, 4]3.3 增强赋值运算符增强赋值也叫复合赋值将运算和赋值合二为一a3a2# 等价于 a a 2 → 5a-2# 等价于 a a - 2 → 3a*2# 等价于 a a * 2 → 6a/2# 等价于 a a / 2 → 3.0a%2# 等价于 a a % 2 → 1.0a**3# 等价于 a a ** 3 → 1.0a//0.5# 等价于 a a // 0.5 → 2.0增强赋值的隐藏特性inplace 操作对于可变对象增强赋值会原地修改而普通赋值会创建新对象# 增强赋值原地修改lst1[1,2]print(f修改前 id:{id(lst1)})# 4378524352lst1[3,4]print(f修改后 id:{id(lst1)})# 4378524352 —— 相同原地修改print(lst1)# [1, 2, 3, 4]# 普通赋值 ... ...创建新对象lst1[1,2]print(f修改前 id:{id(lst1)})# 4378518832lst1lst1[3,4]print(f修改后 id:{id(lst1)})# 4378524352 —— 不同新对象print(lst1)# [1, 2, 3, 4]这个区别在函数参数传递时尤为重要——如果传入一个列表并用修改外部也会受影响。四、和*的拼接操作和*不仅用于数字还支持字符串、列表、元组的拼接# 字符串拼接 s1Hello s2Worldprint(s1s2)# Hello Worldprint(s1*3)# Hello Hello Hello # 列表拼接 lst1[1,2]lst2[3,4,5]print(lst1lst2)# [1, 2, 3, 4, 5]print(lst1*3)# [1, 2, 1, 2, 1, 2]# 元组拼接 tup1(1,2)tup2(3,4,5)print(tup1tup2)# (1, 2, 3, 4, 5)print(tup1*3)# (1, 2, 1, 2, 1, 2)注意不同类型的序列不能直接拼接。# [1, 2] (3, 4) # TypeError! 列表不能和元组拼接五、逻辑运算符and、or、not5.1 基本规则# and两边都为 True 才返回 True但返回的不是 True/False# or至少一边为 True 就返回 True# not取反返回 True 或 False关键点Python 的and和or返回的是对象本身不是布尔值5.2 and 的返回值规则a and b如果bool(a)为False返回a否则返回b。print(0and2)# 0 —— 0 是 falsy返回 0print([]and2)# [] —— 空列表是 falsy返回 []print(3and0)# 0 —— 3 是 truthy返回第二个值 0print(3and5)# 5 —— 3 是 truthy返回第二个值 5print(helloand2)# 2 —— hello 是 truthy返回第二个值 25.3 or 的返回值规则a or b如果bool(a)为True返回a否则返回b。print(2or0)# 2 —— 2 是 truthy直接返回 2print([]or2)# 2 —— [] 是 falsy返回第二个值 2print(0or[])# [] —— 0 是 falsy返回第二个值 []print(helloor2)# hello —— hello 是 truthy直接返回 hello5.4 not 的返回值规则not始终返回True或Falseprint(not2)# Falseprint(not0)# Trueprint(not[])# Trueprint(nothello)# False5.5 短路机制 —— 这是一个重要特性and和or都具有**短路short-circuit**特性如果能从左边确定最终结果右边就不会被执行。# and 的短路左边为 falsy 时右边不执行a0print(aand1/0)# 0 —— 1/0 没有执行否则会报 ZeroDivisionError# or 的短路左边为 truthy 时右边不执行b1print(bor1/0)# 1 —— 1/0 没有执行# 实际应用安全访问dataNoneresultdataanddata[key]# None不会报错# 等价于ifdata:resultdata[key]else:resultdata5.6 all() 和 any() —— 批量逻辑判断# all()所有元素都为 truthy → Trueprint(all([1,2,3]))# Trueprint(all([1,0,3]))# False0 是 falsyprint(all([]))# True —— 空的可迭代对象返回 True# any()至少一个元素为 truthy → Trueprint(any([0,,None]))# False全是 falsyprint(any([0,,1]))# True1 是 truthyprint(any([]))# False —— 空的可迭代对象返回 False注意all([])返回Trueany([])返回False。这是数学逻辑中的空真vacuous truth原则。5.7 逻辑运算符优先级not and or这是固定的优先级顺序# 不加括号not and orprint(TrueandnotFalseorFalse)# True# 实际执行顺序 (True and (not False)) or False# (True and True) or False# True or False# True建议逻辑复杂时加括号比依赖优先级更清晰# 清晰if(age18andhas_id)oris_vip:print(可以进入)# 不清晰虽然结果一样但需要思考优先级ifage18andhas_idoris_vip:print(可以进入)六、成员运算符in 和 not in成员运算符用于判断一个值是否在可迭代对象中# 字符串 shello worldprint(eins)# Trueprint(loins)# True —— 子串也可以print(olnotins)# True# 列表 lst[1,2,3,4]print(2inlst)# Trueprint(5notinlst)# True# 字典判断的是 key不是 valued{name:小明,age:25}print(nameind)# True —— 判断 keyprint(小明ind)# False —— 不判断 valueprint(25ind.values())# True —— 要判断 value用 .values()成员检查的效率对于列表是 O(n)需要逐个遍历对于字典和集合是 O(1)基于哈希表。七、身份运算符is 和 is not# is判断两个变量是否引用同一个对象id 相同# is not判断两个变量是否引用不同的对象a[1,2,3]b[1,2,3]caprint(aisb)# False —— 值相同但不是同一个对象print(aisc)# True —— c 就是 aprint(aisnotb)# Trueis的典型使用场景# 1. 判断是否为 None最常用ifresultisNone:print(没有结果)# 2. 判断是否为特定单例对象iftype(x)isint:print(x 是整数)# 注意不要用 is 比较数字和字符串的值# 小整数缓存只是 CPython 的实现细节不应依赖八、运算符优先级一张表搞定当一行代码中有多个运算符时Python 按照优先级从高到低执行。以下是常用运算符的优先级排序优先级高→低运算符描述1最高**指数2x -x ~x正号、负号、按位取反3* / % //乘、除、取模、整除4 -加法、减法5 位移6按位与7^按位异或8|按位或9 比较10 !等于、不等于11 % / // - * **赋值最低12is is not身份13in not in成员14not逻辑非15and逻辑与16最低or逻辑或记忆口诀算术 比较 身份/成员 逻辑 赋值。有疑问时加括号是最安全的做法。# 不加括号难读resultab*cdandeorf# 加括号一目了然result((a(b*c))d)andeorf九、动手练习练习 1运算符综合计算# 请心算以下表达式的值然后运行验证a10b3print(a//ba%b)# ?print(a**b-b**a)# ?print(not(abandb0))# ?练习 2增强赋值的原地修改陷阱defadd_item(lst,item):lstlst[item]# 这是创建新列表print(f函数内部:{lst})my_list[1,2,3]add_item(my_list,4)print(f函数外部:{my_list})# 还是 [1, 2, 3]# 改为 lst [item] 再试试看练习 3短路机制实战# 不用 if 语句用短路机制实现默认值nameinput(请输入姓名直接回车跳过: )or匿名用户print(f你好{name})# 思考为什么 input 返回空字符串时or 会生效小结这篇文章覆盖了 Python 的七类运算符。核心要点类别关键点常见坑算术//是向下取整不是去小数-10 // 3 -4不是-3比较比值is比对象小整数缓存-5~256赋值对可变对象是原地修改多目标赋值可变对象共享引用逻辑and/or返回对象本身有短路混淆and/or和/|成员字典判断的是 key小明 in {name:小明}→ False身份is None是判断 None 的标准写法不要用is比较数字值下一篇文章我们将进入条件语句——if/elif/else、三元表达式、条件嵌套看看 Python 如何优雅地实现分支逻辑。本文是「Python从入门到数据分析」系列的第 4 篇共 24 篇。关注我不错过后续更新。