大家好,我是 MuSen,一个爱分享、带你轻松玩转编程的引路人。
在前面的课程中,我们已经拥有了“魔法盒子”(变量),里面装满了各种“神奇道具”(数据类型),并且学会了如何跟程序进行“对话”(输入输出)。
但是,如果我们只把数据存在盒子里,那它们就只是一堆死物。如何让这些数据跑起来、发生奇妙的化学反应呢?这就需要用到我们今天的主角——运算符(Operators)。
今天这节课干货满满,不仅有基础运算,还会带你揭秘底层硬核的“位运算”,以及教你如何写出像大厂工程师一样优雅规范的代码。准备好了吗?我们发车!🚀
4.1 算数运算符:数字的魔法体操 🧮
算数运算符大家最熟悉,就是加减乘除。但在 Python 中,它有几个隐藏的进阶玩法。
+加 /-减 /*乘:和数学里一模一样。/除:注意!无论能不能除尽,结果永远是浮点数 (float)。20 / 10结果是2.0。//整除(向下取整):除完之后只保留整数部分,把小数抹掉。10 // 3结果是3。%取模(求余数):除法运算后只拿余数。20 % 10是0,10 % 3是1。幂(次方):算次方的神器。
2 3也就是 2 的 3 次方,结果是8。
4.2 赋值运算符:给变量贴标签的N种姿势 🏷️
最基础的赋值运算符是 =,它的意思是“把右边的值,交给左边的变量”。 在此基础上,为了偷懒,程序员发明了“复合赋值运算符”:
+=、-=、*=、/=... 这其实是简写。比如a += 2,其实就是a = a + 2的缩写!少敲了几下键盘,极其舒适。
😎 MuSen 传授:Python 3.8 新增神技 —— 海象运算符 := 为什么叫海象?因为 := 长得就像一只有两颗长牙的海象!🦭 它可以在一个表达式中,同时完成赋值和运算,极其适合写出紧凑的高级代码。
num1 = 20
# 传统写法需要两行:
# num2 = 3 ** 2
# print(num2 > num1)
# 海象运算符写法(一行搞定,不仅给num2赋了值,还顺便参与了比较):
print((num2 := 3**2) > num1) # 输出: False
print(num2) # 输出: 9
4.3 比较运算符:无情的裁判 ⚖️
比较运算符用来比较两个值,它的结果永远是非黑即白的布尔值:True 或 False。
==(等于)、!=(不等于)>(大于)、<(小于)、>=(大于等于)、<=(小于等于)
💣 MuSen 的避坑警告:跨物种不能比较! 不同的数据类型之间是不能直接比较大小的(比如拿数字
10去和字符串"abc"比大小,程序会直接报错)。🧠 面试常考:字符串比大小的潜规则 面试官:“
print('15' > '6')的结果是什么?” 很多小白会下意识回答 True,大错特错!结果是 False! 原因:字符串比较大小,不是比拼长短,也不是拼拼凑在一起的数字大小!它是从最左边的字符开始,逐个去比较它们的 ASCII 码值。'15'的第一个字符是'1',而'6'的第一个字符是'6'。显然'1'的 ASCII 码比'6'小,所以直接判定为False!
4.4 逻辑运算符:复杂条件的终结者 🧠
and(与):两人必须都同意才行。左右两边都是 True,结果才是 True。or(或):只要有一人同意就行。左右只要有一个是 True,结果就是 True。not(非):杠精本精。你是 True 它偏要变 False,你是 False 它变成 True。
💎 面试超硬核专区:逻辑运算的“短路机制”与“真值返回”
只要懂了这个,你就能看懂大佬们写的浓缩代码! Python 里的
and和or其实很懒(短路),并且它返回的不一定是 True/False,而是最后计算的那个真实数据!
print(5 and 8):and要求两边都是真。看到5(真),它还不能确定,必须接着看右边,于是找到了8,最终返回8。
print(0 and 8):看到0(假),直接短路!反正已经没救了,右边连看都不看了,直接返回0。
print(5 or 8):or只要一个真就够了。看到5已经是真了,右边直接不管了!返回5。
print(0 or 8):看到0(假),还得接着往后找,找到8是真,最终返回8。
4.5 成员与身份运算符:找茬大师 🕵️
1) 成员运算符 (in / not in)
用来判断某个家伙是不是在一个序列(比如列表、字符串)里面。
test_list = [1, 2, 3, 4, 5]
print(1 in test_list) # 输出 True
print(20 not in test_list) # 输出 True
2) 身份运算符 (is / is not) 【面试极高频!】
🧠 绝杀面试:
is和==到底有什么区别?
==比较的是“脸”(值):长得一样就行。
is比较的是“身份证号”(内存地址):不仅要长得一样,还得是同一个人(在内存中占据同一个位置)。等同于id(a) == id(b)。来看这段极其经典的防坑代码:
a = [1, 2, 3] b = a print(b is a) # True (给同一个箱子贴了两个标签) b = a[:] # 切片操作:强行复制了一个长得一模一样的新箱子 print(b == a) # True (长得一样) print(b is a) # False (不是同一个箱子,内存地址变了!)
4.6 位运算符:直击底层的黑色魔法 ⚡ (了解即可)
这一块属于内功修炼。计算机底层只认识 0 和 1,所有的计算最终都会变成二进制的位运算。速度极快,但也极其烧脑!
位运算符有:&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、<<(左移)、>>(右移)。
要想懂位运算,你得先知道机器是怎么存数字的:
原码:把数字转成二进制。最高位是符号位(0代表正数,1代表负数)。比如
7的原码是00000111,-7就是10000111。反码:正数的反码跟原码一样;负数则是符号位不变,其他位 0 变 1,1 变 0。
补码:正数的补码还是原码;负数是在反码的基础上 +1。
⚠️ 核心铁律:计算机底层进行位运算时,统统都是以补码形式进行的! 特别注意右移 >>:如果是负数右移,它是向负无穷取整(向下取整),而不是简单地把右边的截断!
注:在日常写业务代码时(如开发网站、做数据分析),极少会用到位运算。但如果你做底层开发或刷算法题,位运算就是神兵利器。
4.7 运算符优先级 🚥
这就像数学里的“先乘除后加减”。Python 里也有优先级。 一句话总结:算术运算符 > 位运算符 > 比较运算符 > 逻辑运算符。
MuSen 避坑指南:哪怕你记忆力再好,也千万不要去死记硬背优先级表! 只要你觉得有歧义的地方,请直接加上小括号 ()。这不仅能避免报错,更是为了让你三个月后回来看代码时不至于骂自己。
4.8 PEP 8 大厂编码规范:写代码也是一门艺术 🎨
代码不只是写给机器看的,更是写给人(你的同事、未来的你)看的。 Python 官方有一份极其著名的指导圣经,叫做 PEP 8(Python Enhancement Proposal 8)。遵循它,你的代码看起来就像是大厂高级工程师写出来的。
1)缩进:Python的灵魂
Python 不用大括号 {},全靠缩进认兄弟。 规范:每次缩进必须使用 4 个空格!千万不要把制表符(Tab)和空格混用,这会让解释器彻底精神分裂,报出恶心的缩进错误。 (好在现在主流的代码编辑器,你按下 Tab 键,它会自动帮你转换成 4 个空格。)
2)行长:别让眼睛太累
规范:建议每行代码不超过 79 或 80 个字符(注释不超过 72 个字符)。 如果代码太长,编辑器上会有一条竖线提醒你。太长的代码可以通过换行符或括号分成多行。
3)空行:代码的呼吸感
规范:
不同的函数或类之间,用两个空行隔开。
函数内部不同的逻辑块之间,用一个空行隔开。 千万别整个文件从头写到尾一个空行都没有,也别滥用(比如每写一行就空三行)。
4)禁忌:永远不要在一行写多条语句
虽然你可以用分号 ; 把好几句代码强行塞在一行: import sys; print(sys.path) # 丑陋且极不推荐! 规范:老老实实换行!并且行尾永远不要加分号,这是 Python,不是 C++ 或 Java。
5)源文件编码与空格
源码请雷打不动地使用 UTF-8 编码。
任何代码行的结尾,都不要留下多余的空格(Trailing whitespace)。有些严格的编辑器检测到行尾多余的空格会直接标红警告。
写在最后
今天这节课,我们彻底打通了变量之间的关系。从基础的加减乘除,到诡异的逻辑短路机制,再到直接操控底层的位运算,最后还学习了如何用 PEP 8 规范把代码写得如同诗一般优美。
你现在手里的武器库已经非常丰富了。下一关,我们将迎接程序的骨架——条件判断与循环结构,准备好让代码跑出千万种分支了吗?
我是 MuSen,我们会点儿技术,有点儿意思。准备好进入下一关了吗?咱们下期见!👋