本节摘要:程序处理的一切都是数据,而数据的"形状"决定了它能做什么。本节从"一笔账该存成什么样子"出发,讲清变量、五种核心数据类型(整数、浮点数、字符串、布尔值、空值)和三种容器(列表、字典、元组)的分工,最后落到轻记账的数据设计上:单笔账用字典,全部账目用列表。这个设计会一直用到第五章数据库登场。
阅读完本节,你应当能够:
记一笔账,至少要有金额和用途,最好还有日期。问题来了:金额写成 12 还是 "12"?日期写成 2026-09-02 还是一个数字?不同的写法在程序里的行为完全不同——12 + 12 得 24,"12" + "12" 得 "1212"。数据类型不是课本上的名词表,它直接决定你程序的对错。

变量就是名字。Python 里创建变量不需要声明类型,赋值即创建:
amount = 12.5 # 金额,浮点数 item = "早饭" # 用途,字符串 count = 1 # 第几笔,整数 is_refunded = False # 是否已报销,布尔值 note = None # 备注暂时为空
等号不是"相等",是"把右边的数据装进左边的名字里"。所以这样的代码完全合法:
total = 0 # 总额从 0 开始 total = total + amount # 旧值加新值,再装回 total print(total) # 12.5
命名习惯用小写加下划线。名字要描述内容——amount 一眼懂,a 三天之后自己都不认识。
ledger = [] # 空账本 ledger.append({"item": "早饭", "amount": 12.5}) # 记一笔 ledger.append({"item": "地铁", "amount": 4.0}) print(len(ledger)) # 2 —— 账目条数 print(ledger[0]["item"]) # 早饭 —— 下标从 0 开始
单笔账有金额、用途、日期三个字段,用字典最贴切——每个字段有名字,取值按名不按位置:
record = {"item": "早饭", "amount": 12.5, "date": "2026-09-02"} print(record["amount"]) # 12.5 record["note"] = "公司楼下" # 随时加新字段
坐标、星期几这种"固定组合"用元组。试着改它会直接报错——这个"不容更改"正是它的价值:
position = (3, 5) position[0] = 9 # TypeError —— 元组不可修改
💡 关键直觉:列表用"位置"想数据,字典用"名字"想数据。什么时候选哪个,先问自己:取值时我知道下标,还是知道字段名?轻记账里单笔账总是按字段取(取金额、取用途),所以选字典;账本整体是"第 1 笔、第 2 笔"的顺序集合,所以选列表。
用途、日期、备注全是字符串,它的三个高频操作现在就该练熟:
item = "早饭" # 切片:取一部分 print(item[0:1]) # 早 # 拼接与重复 print("-" * 20) # -------------------- # 格式化:把变量嵌进句子,f 字符串是现代写法 print(f"{item} 花了 {12.5} 元") # 早饭 花了 12.5 元
f 字符串里花括号内可以放任意表达式,f"合计 {sum:.1f} 元" 还能控制小数位数——打印汇总时用它保持对齐。
把本节所学拼起来,写出 v0.1 的核心数据结构:
ledger = [ {"item": "早饭", "amount": 12.5, "date": "2026-09-01"}, {"item": "地铁", "amount": 4.0, "date": "2026-09-01"}, {"item": "奶茶", "amount": 18.0, "date": "2026-09-02"}, ] total = 0 for record in ledger: # 循环下一节细讲,先感受效果 total = total + record["amount"] print(f"共 {len(ledger)} 笔,合计 {total:.1f} 元") # 输出:共 3 笔,合计 34.5 元
变式一:给每笔账加 note 字段,有的有值有的用 None,打印时遇到 None 就显示"无"。变式二:思考金额用 float 的隐患——0.1 + 0.2 的结果是 0.30000000000000004。记账应用对精度敏感,工程上常用"以分为单位的整数"存储,展示时再除以 100。这个取舍现在记住,第五章数据库选型时会回来用它。
ledger[1] 是第二笔,不是第一笔record["amout"] 会得到 KeyError,检查拼写"12" + 3 直接 TypeError,用 int() 或 float() 先转换数据有了形状,下一节让程序对它做判断、做重复——输入不同指令走不同分支,账本从"死数据"变成"能交互的程序"。