到了中午,Maya 脑子里记着六个数,已经漏掉两个。给每个数起名字——杯数、单价、找零——是第一步。可如果同一个名字这次装的是文字,而不是数字呢?
变量给值起名字,让程序可以重复使用它。Python 是动态类型语言:你不需要声明类型,但每个值仍然有类型。理解类型,才能预测运算符和函数的行为。 你还会看到别名如何改变列表,以及为什么转换应该放在边界。
赋值就是给值起名
等号把右边的值赋给左边的名字。重新赋值会替换旧值。变量名要描述用途,例如用 order_total 而不是 t。
price = 4.5
quantity = 3
total = price * quantity
print(total)一次小计算
先认识四种类型
整数保存整数值,浮点数保存小数,字符串保存文本,布尔值只有 True 和 False。type() 可以查看任何值的类型。看起来像数字的值,如果加了引号,仍然是字符串。
print(type(7).__name__)
print(type(4.5).__name__)
print(type("7").__name__)
print(type(True).__name__)查看类型
有意识地转换类型
int() 把兼容的文本或小数转成整数,float() 转成小数,str() 把值转成文本。转换可能失败:int("hello") 会抛出 ValueError,后面会学习如何处理它。
count = int("12")
price = float("4.5")
label = str(2026)
print(count, price, label)显式类型转换
一个名字可以指向可变对象
赋值不会复制列表。alias = orders 让两个名字指向同一个对象,所以通过一个名字修改,另一个也会看到。orders[:] 创建浅拷贝;如果列表里还有列表,内层对象仍然共享。
orders = ["latte", "tea"]
alias = orders
copy = orders[:]
alias.append("mocha")
copy.append("water")
print(orders)
print(copy)
records = [{"id": 1}]
shallow = records[:]
shallow[0]["id"] = 99
print(records)别名、浅拷贝和共享的内层对象
在边界处转换一次
来自文件、网址和表单的值一开始都是文本。在边界处转换一次,之后就用数字计算。反复转换会把类型错误扩散到整个程序;只转换一次,后面的代码才可预测。
raw_count = "3"
raw_price = "4.50"
count = int(raw_count)
price = float(raw_price)
total = count * price
print(type(count).__name__, type(price).__name__)
print(f"{total:.2f}")把文本变成数字一次
不要直接用 == 比较浮点数
在二进制浮点数里,0.1 + 0.2 并不精确等于 0.3。这个微小差异用 print() 看不出来,但用在相等判断里就会出错。展示时可以 round,做判断时用 math.isclose(),或者改用整数分。金额常用整数分保存,就是这个原因。
total = 0.1 + 0.2
print(total)
print(total == 0.3)
print(round(total, 2) == 0.3)
cents = 10 + 20
print(cents / 100)近似浮点数与精确整数分
本课要点
- 赋值把名字绑定到值,重新赋值会替换原值。
- int、float、str、bool 是最先要熟悉的四种类型。
- type(value).__name__ 会返回可读的类型名称。
- 做算术前,先把输入或文本转换成数字。
- 给列表赋值可能只是起别名;切片只复制外层列表。
- 浮点数是近似值;比较时用误差范围,或者改用整数分。
常见错误
- 把字符串和数字直接相加,没有先转换其中一边。
- 以为 / 返回整数;在 Python 3 中,除法总是返回浮点数。
- 在赋值之前使用变量,会触发 NameError。
- 以为 b = a 复制了列表,其实两个名字指向同一个对象。
- 浮点数运算之后直接写 if total == 0.3。
为一个商品创建名称、单价和数量变量,打印保留两位小数的总价。
动手试试
改改变量、先预测输出,再运行代码。第一次点击“运行代码”时会下载 Python 运行时,可能需要几秒钟。
练习本课
12 道题,作答后立即看到解释。