运算符
写在值之间、用来计算、比较或绑定的符号;同一符号在不同类型上可以表示不同运算。
它是什么
运算符 是写在值之间的符号,用来计算、比较或赋值。加减乘除是算术运算;>、== 是比较;= 是赋值;and、or、not 是逻辑运算,常和 选择 一起出现。运算符看起来像数学课上的记号,职责却并不总与课堂相同:尤其是单独的 =,在程序里执行写入,而不是断言相等。
total = 2 + 3 * 4
ok = total > 10 and total != 14乘法先于加法,这和数学课上的顺序一致。比较的结果是布尔值,属于 数据类型 里的一种。
名字从哪来
operator 在数学里指「作用在运算对象上的符号」。加减号用了上千年;等号由罗伯特·雷科德(Robert Recorde)在 1557 年引入,理由是「世界上没有两件东西比两条平行线更相等」。编程沿用这些符号,又加了计算机特有的写法:== 表示比较,把单独的 = 留给赋值;** 表示乘方;// 表示向下取整的除法。
逻辑运算符则来自布尔代数:用真假组合出更复杂的条件。判断再套判断,仍是一个路口,见 逻辑嵌套。它们不是装饰,而是把判断本身写成可执行的形式。
它怎么工作
解释器先按优先级求值,再把结果交给后面的语句。除数为零时,算术无法完成,会抛出 异常。比较不改变原来的值,只得到真或假。赋值会改 变量 指向谁。+=、-= 是「取出、运算、再放回去」的简写。
逻辑运算里,and 要两边都真才真;or 有一边真就真;not 把真假翻转。Python 还可能「短路」:左边已经能决定结果时,右边不再计算。这意味着右边若有副作用或可能失败的运算,不一定会发生——边界写在哪一侧,会影响程序实际走过的路。
生活里在哪里
天平比较两边谁更重,并不改变两侧的质量;路口的通行条件往往是合取:灯是绿灯,并且没有行人正在过线。计算器上的每一个键都是一种运算,但计算器很少把「比较」和「写入」做成两个极易混淆的符号。程序把二者都交给键盘上几乎相同的等号,于是这一对符号成为阅读代码时最需要放慢的地方。
和相近概念的差别
运算符作用在已有的值上。函数 也可以计算,但函数有名字、可以包含多步;运算符通常是一个符号。= 和 == 长得像,职责相反:一个写入,一个提问。
类型不同,同一符号可以表示不同运算。字符串和数字用 + 并不能自动接到一起,需要先转换,见 数据类型。这不是运算符「坏了」,而是它拒绝把两种不相干的模型混成一次加法。
常见误会
误会 1:= 用来判断相等。
判断相等必须写 ==。写错时,有的地方会直接报错,有的地方会悄悄赋了值,随后的 选择 就会走错支路。
误会 2:除法总是整除。
/ 得到浮点数;// 才丢弃小数部分(更准确地说,是向下取整)。负数的 // 朝负无穷方向取整,和「朝零截断」不是一回事。
误会 3:写了比较,原来的值就会被改掉。
比较产生一个新的布尔值。要改变变量指向谁,仍然需要赋值。
想知道更多
- 书:布鲁克希尔《计算机科学概论》
- 书:查尔斯·佩措尔德《编码:隐匿在计算机软硬件背后的语言》
- 书:埃里克·马瑟斯《Python编程:从入门到实践(第3版)》
- 书:艾伦·唐尼《像计算机科学家一样思考Python(第2版)》
未登录时不会保存学习进度