Python 变量、基础类型与转换:看见数据怎样变化
用库存数据的运行轨迹,图解变量名与值、重新绑定、str、int、float、bool、None,以及文本转整数和转换失败发生在哪一步。
本文目录 7 节 · 点击展开
从 Excel、CSV 或网页表单读到库存时,眼前的 "3" 和真正能参与比较的数字 3 看起来很像,Python 却会把它们当成两种数据。
这一篇先不急着写复杂程序。我们只跟着一条 SKU 为 K161 的库存数据,亲眼看见它怎样被命名、转换、比较,以及错误会在哪一步拦住后续代码。
变量:一个名字怎样指向一个值
先运行一行最简单的代码:
stock = 8
Python 会先读右边的 8,再让左边的名字 stock 指向这个整数值。= 在这里表示“绑定”,不是数学题里的“左右相等”。
stock = 8 怎样进入变量状态stock以后用这个名字找到数据8int · 可以参与数值运算执行后状态:名字是 stock,值是 8。两者有关联,但不是同一件事。
这一区分很重要:变量名负责让代码容易阅读,值才是实际参与计算的数据。名字可以换,名字指向的值也可以换。
再赋值不是把 8 改成 5
stock = 8
stock = 5
第二行执行时,名字 stock 会改为指向新的整数值 5。从这时起,再读取 stock 得到的是 5。
stock→8读取 stock 会得到整数 8。
stock = 5先得到右边的 5,再更新名字的指向。
stock→5名字没有变;之后读取到的值变成了 5。
你不需要把变量想成一个会被涂改的盒子。对入门阶段来说,记住一句话就够:再次赋值,会让同一个名字代表新的值。
一条商品记录里有五种基础值
真实脚本通常会同时处理文字、整数、小数、真假和缺失值:
sku = "K161"
price = 129.9
stock = 8
is_available = stock > 0
remark = None
print(sku, price, stock, is_available, remark)
sku- ”K161”str · 标识与文字要保留字母,不做加减
price- 129.9float · 带小数的数值可参与金额计算
stock- 8int · 整数适合库存、件数、次数
is_available- Truebool · 真或假来自
stock > 0的结果 remark- NoneNone · 暂无值不是空文字、0 或 False
这里最容易混淆的是“长得像数字的文字”。例如订单号 "1008611" 虽然全是数字,通常仍应保留为 str,因为它是标识,不拿来做算术。库存 "3" 则需要先转成 int,才能与补货线比较。
如果不确定一个值的真实类型,可以让 Python 直接告诉你:
raw_stock = "3"
price = 129.9
remark = None
print(type(raw_stock)) # <class 'str'>
print(type(price)) # <class 'float'>
print(type(remark)) # <class 'NoneType'>
bool 通常是比较出来的结果
stock = 3
is_low_stock = stock < 5
print(is_low_stock) # True
Python 先计算表达式 stock < 5,得到布尔值 True,再把名字 is_low_stock 绑定到它。这里的 True 不是一段说明文字,也不是手工填写的状态。
本章只需要两组运算符:
| 用途 | 运算符 | 例子与结果 |
|---|---|---|
| 基础算术 | + - * / | 2 * 129.9 得到 259.8 |
| 基础比较 | == != > >= < <= | 3 < 5 得到 True |
尤其要分清:stock = 3 是赋值,stock == 3 才是判断是否相等。
None 则表示“目前没有具体值”。它和 ""、0、False 都不同:
remark = None
print(remark is None) # True
从文本到判断:看见每一步的状态
库存从外部进入 Python 时常常是文本。下面这段代码可以独立运行,它完成了一条完整路径:输入文本、转换整数、比较补货线、输出结果。
raw_stock = "3"
stock = int(raw_stock)
is_low_stock = stock < 5
message = f"库存:{stock},需要补货:{is_low_stock}"
print(message)
输出:
库存:3,需要补货:True
”3” 怎样一步步变成 True- 01 · 输入
raw_stock = “3”- 之后
raw_stock → “3”- 类型
str
引号说明它仍是文本,不能直接和整数 5 比较。
- 02 · 当前行
stock = int(raw_stock)- 之前
raw_stock → “3” · str- 之后
stock → 3 · int
int()创建整数 3;原来的raw_stock仍是文本。 - 03 · 条件
stock < 5- 代入
3 < 5- 结果
True · bool
比较不会改变 stock,而是产生一个新的布尔值。
- 04 · 输出
print(message)- 库存
3- 需补货
True
前面产生的状态被组织成一行可读结果。
这条轨迹里产生了三个不同的值:文本 "3"、整数 3、布尔值 True。转换并不是给原文本换一个标签,而是得到一个类型不同的新值。
常用转换先记住这三个就够:
stock = int("20") # 20
price = float("19.9") # 19.9
label = str(20) # "20"
转换失败:错误发生在 int(),不是比较时
int() 会尝试把文本解释成整数,但它不会保证任何文字都能转换。把中文数字“三”交给它时,代码会停在第二行:
raw_stock = "三"
stock = int(raw_stock)
is_low_stock = stock < 5
- 01 · 输入成功
raw_stock = “三”状态中已有
raw_stock → “三”,类型是str。 - 02 · 出错行
stock = int(raw_stock)ValueError:
结果:转换没有产出整数,变量“三”不是int()能识别的整数写法。stock也没有在这一行成功建立。 - 03 · 未执行
is_low_stock = stock < 5程序已经在上一步停止,因此比较没有发生,也不会得到 True 或 False。
看到这类报错时,不要只盯着最后想要的“补货判断”。先沿轨迹向前找:输入是什么类型,转换函数收到了什么,在哪一行没有产生预期的新值。后续的错误处理篇会继续讲怎样接住坏数据;本章先学会准确指出失败位置。
动手练习:追踪 K161 的库存状态
先复制并运行完整代码:
sku = "K161"
raw_stock = "3"
reorder_level = 5
stock = int(raw_stock)
is_low_stock = stock < reorder_level
print(f"{sku} 当前库存 {stock}")
print(f"需要补货:{is_low_stock}")
然后按执行顺序写出答案:
raw_stock的值和类型分别是什么?- 执行
stock = int(raw_stock)后,新产生了什么值? stock < reorder_level代入数字后是什么表达式,结果是什么类型?- 把
raw_stock改成"8",从哪一步开始与原轨迹不同? - 把
raw_stock改成"三",具体哪一行失败,后面哪一行不会执行?
如果你能不运行代码就说出每一步的前后状态,再运行确认答案,这一章就已经达标。