跳到主要内容

2.2 数字与运算符

上一节我们把数据存进了变量,这一节让数据"动"起来——做计算、做比较、做判断。这些都靠运算符完成。

Python 是一个超强计算器

先热个身。打开终端输入 python 回车,进入交互模式(出现 >>> 提示符),它就是一个随手可用的计算器:

>>> 10 + 3
13
>>> (100 - 20) * 0.8
64.0

.py 文件里则要用 print() 才能看到结果。本节示例两种方式都可以练。

算术运算符:先看熟悉的四个

print(10 + 3) # 13 加
print(10 - 3) # 7 减
print(10 * 3) # 30 乘
print(10 / 3) # 3.3333333333333335 除

两个和数学课不一样的地方:

  1. 乘号是 *,不是 ×除号是 /,不是 ÷。键盘上没有数学符号,编程语言都这么约定。
  2. 除法 / 的结果永远是浮点数,哪怕能除尽:
print(10 / 2) # 5.0,不是 5!
print(type(10 / 2)) # <class 'float'>

记住这个细节,以后看到 5.0 别以为程序算错了。

再看三个新面孔:// 、% 、**

这三个数学课上没有,但编程里非常常用。用一个分糖果的例子就能全部理解:

17 颗糖,平均分给 5 个人,每人分几颗?剩几颗?

print(17 / 5) # 3.4 普通除法:数学上的精确答案
print(17 // 5) # 3 整除:每人分 3 颗(只要商的整数部分,直接舍去小数)
print(17 % 5) # 2 取余:分完还剩 2 颗(读作"17 模 5")
  • //(整除):做除法,只保留整数部分
  • %(取余):做除法,只要余数

% 看着不起眼,实际是编程中的明星运算符。最经典的用途——判断奇偶

print(8 % 2) # 0:能被 2 整除,余数为 0,是偶数
print(7 % 2) # 1:余数为 1,是奇数

任何数 % 2,结果是 0 就是偶数,是 1 就是奇数。下一章学了 if 判断,这一招会天天用。

最后是幂运算 **

print(10 ** 3) # 1000,10 的 3 次方
print(2 ** 10) # 1024,2 的 10 次方

⚠️ 别把"10 的 3 次方"写成 10 ^ 3^ 在 Python 里是另一个运算符(异或),不会报错但结果完全不对——这种"不报错的错"最难发现。

运算优先级:不确定就加括号

优先级和数学一致:先算 **,再算 * / // %,最后算 + -

print(1 + 2 * 3) # 7,先乘后加
print((1 + 2) * 3) # 9,括号最优先

实际写代码的建议很简单:稍微复杂一点的算式就加括号。括号不花钱,可读性无价:

# 摄氏度转华氏度,加了括号一眼看懂运算顺序
c = 25
f = (c * 9 / 5) + 32
print(f) # 77.0

变量参与运算

运算符两边不仅能放数字,也能放变量——这才是日常写法:

price = 299
count = 3
total = price * count
print(total) # 897

重点来了。还记得上一节说 = 不是"等于"吗?现在看这行经典代码:

score = 10
score = score + 5
print(score) # 15

score = score + 5 在数学里是不成立的(一个数怎么会等于自己加 5?),但在 Python 里完全合理,因为 = 是个动作,分两步执行:

  1. 先算右边:score + 5,也就是 10 + 5,得到 15
  2. 再把 15 存回左边的 score,覆盖旧值

先算右边,再存左边——想通这一行,赋值就真正学会了。

复合赋值:+= 系列简写

"在自己基础上修改"太常用了,Python 提供了简写:

score = 10
score += 5 # 等价于 score = score + 5,现在是 15
score -= 3 # 等价于 score = score - 3,现在是 12
score *= 2 # 等价于 score = score * 2,现在是 24
score //= 5 # 等价于 score = score // 5,现在是 4
print(score) # 4

规律:x 运算符= 值 就是 x = x 运算符 值。最常见的是 += 1(计数)和 += 某个数(累加),学循环时它们是绝对主力。

比较运算符:结果是 True 或 False

比较两个值的大小或是否相等,运算结果是布尔值——上一节埋的伏笔 bool 类型,在这里登场了:

print(3 > 2) # True 大于
print(3 < 2) # False 小于
print(3 >= 3) # True 大于等于
print(3 <= 2) # False 小于等于
print(3 == 3) # True 等于
print(3 != 2) # True 不等于

三个说明:

  • 判断相等是两个等号 ==。一个 = 已经被赋值占用了,所以判断相等只能用两个。
  • != 读作"不等于",! 在编程里普遍表示"非"。
  • >=<= 的顺序不能反,写 => 会报 SyntaxError。

⚠️ 本节最大的坑:=== 混用。 想判断却写成赋值,是所有新手的必经之路:

age = 18
print(age == 18) # True,判断:age 是不是 18?
print(age = 18) # ❌ SyntaxError,这是赋值,不能放在 print 里

记忆口诀:一个等号是"存",两个等号是"问"

比较的结果可以存进变量,它就是一个普通的 bool 值:

is_adult = age >= 18
print(is_adult) # True

逻辑运算符:组合多个条件

现实中的判断往往不止一个条件:"年龄大于 18 并且 小于 60"、"是周六 或者 是周日"。这就需要逻辑运算符 andornot

age = 20

print(age > 18 and age < 60) # True:and 要求两边都为 True
print(age < 18 or age > 60) # False:or 只要有一边 True 就行
print(not age > 18) # False:not 把结果取反
运算符含义规则生活化理解
and并且两边都真才真"有学历并且有经验"——缺一不可
or或者有一边真就真"刷卡或者扫码"——满足一个就行
not取反真变假,假变真"下雨"

一个容易犯的错:想表达"age 在 18 到 60 之间",不能偷懒写成 age > 18 and < 60(❌ SyntaxError)——and 两边必须各自是完整的条件:

print(age > 18 and age < 60) # ✅ 完整写法
print(18 < age < 60) # ✅ Python 还支持这种数学式连写,效果相同

几个实用的内置函数

print()type() 一样开箱即用:

print(abs(-5)) # 5 绝对值
print(round(3.567)) # 4 四舍五入到整数
print(round(3.567, 2)) # 3.57 四舍五入保留 2 位小数
print(max(3, 7, 1)) # 7 最大值
print(min(3, 7, 1)) # 1 最小值

round(数, n) 的第二个参数表示保留几位小数,处理价格、成绩时常用。

浮点数的著名陷阱

运行这行代码,做好心理准备:

print(0.1 + 0.2) # 0.30000000000000004 ???

不是 bug,也不是 Python 独有——所有主流编程语言都这样。原因简单说:计算机内部用二进制存数字,而 0.1、0.2 这样的小数在二进制里是"除不尽"的(就像 1/3 在十进制里是 0.3333… 一样),只能存一个极其接近的近似值,运算后误差就露出来了。

对新手而言记住两点就够:

  1. 日常计算不用管它,误差小到可以忽略;显示时用 round() 或 f-string 修剪即可
  2. 不要用 == 直接判断两个浮点数相等
print(0.1 + 0.2 == 0.3) # False!就是这个误差导致的
print(round(0.1 + 0.2, 2) == 0.3) # True,先 round 再比较

练习

新建 practice22.py 完成:

1. 一件衣服原价 299 元,打 7.5 折,算出折后价并保留 2 位小数。

2. 小明有 17 颗糖,平均分给 5 个朋友:每人分几颗?还剩几颗?(用 //%

3. 不运行,先猜下面每行的输出,再验证:

print(10 / 5)
print(2 ** 3 ** 1)
print(7 % 2 == 1)
x = 5
x += x
print(x)

4. 下面的代码想判断 score 是否在 60 到 100 之间,但有两处错误,找出来修好:

score = 85
print(score >= 60 and <= 100)
print(score = 85)
点击查看答案
# 1
price = 299 * 0.75
print(round(price, 2)) # 224.25

# 2
print(17 // 5) # 每人 3 颗
print(17 % 5) # 剩 2 颗

第 3 题:

  • 10 / 52.0/ 结果永远是浮点数)
  • 2 ** 3 ** 18(3 的 1 次方是 3,2 的 3 次方是 8)
  • 7 % 2 == 1True(7 是奇数,余数为 1)
  • x += x10(等价于 x = x + x,即 5 + 5)

第 4 题:

score = 85
print(score >= 60 and score <= 100) # and 两边要各自写完整条件
print(score == 85) # 判断相等用两个等号

本章小结

  • 七个算术运算符:+ - * / // % **/ 结果永远是浮点数;% 取余可判断奇偶
  • 赋值先算右边再存左边,所以 score = score + 5 成立;简写为 score += 5
  • 比较运算的结果是 True / False;= 是存,== 是问
  • and 两边都真才真,or 一边真就真,not 取反;and/or 两边必须是完整条件
  • 浮点数有精度误差,别用 == 直接比较,先 round()

下一节:2.3 字符串