第1章 1.2 变量、标识符与基本数据类型
🎯 开场:上一章我们搭好了舞台,这一章我们要开始「演戏」了
上一章我们搞定了 Python 安装和环境配置,现在你的电脑上应该装好了一个能跑 Python 代码的地方。打个比方,上一章我们建好了厨房,接下来要学怎么「炒菜」了。
你有没有遇到过这种情况?写代码的时候,数字算着算着突然变成了乱码,或者字符串和数字混在一起程序就报错了——这些都是因为不清楚数据在程序里是怎么存储的。
今天这章,我们就把「数据」这件事彻底搞清楚。学完之后,你就能:
- 像整理衣柜一样整理你的数据
- 避免「1 + 1 = 11」这种让人哭笑不得的错误
- 为下一章「字符串处理」打下扎实基础
准备好了吗?我们从一个小明的故事开始。
🧱 基础:变量和数据类型——程序世界的「收纳盒」
变量是什么?——给数据贴标签
生活类比:想象你有一个超级大的储物柜,每个格子上可以放一样东西。你在每个格子上贴一张标签(变量名),这样下次想找东西时,直接喊标签名就行了,不用一个个格子翻。
为什么用:程序里处理的数据可能很多、很复杂,给它们起个名字方便记忆和使用。
怎么用:
# 小明今天买了一个西瓜
price = 15.5 # 西瓜价格是 15.5 元
weight = 3.2 # 西瓜重量是 3.2 斤
name = "西瓜" # 这个东西叫"西瓜"
is_ripe = True # 这个西瓜是熟的
print(f"小明买了 {name},花了 {price * weight} 元")
运行结果:
小明买了 西瓜,花了 49.6 元
解释:price 就是一个变量名,它指向内存里存着 15.5 这个数字的位置。就像你给储物柜贴上「西瓜价格」这个标签,柜子里放的是 15.5。

标识符命名规范——给变量起名字的规矩
生活类比:起名字不能乱起,要符合规则。比如人名不能用数字开头、不能用特殊符号。
Python 里起变量名(标识符)也有规则:
| 规则 | 正确示例 | 错误示例 | 原因 |
|---|---|---|---|
| 字母或下划线开头 | name, _count |
2nd_place |
数字不能开头 |
| 只能有字母、数字、下划线 | user_name, age1 |
user-name, my age |
短横线和空格是「非法字符」 |
| 大小写敏感 | Name 和 name 是两个变量 |
— | Python 区分大小写 |
| 不能用关键字 | class_ = 1 |
class = 1 |
class 是 Python 保留字 |
为什么用:遵循规范,代码更易读,团队协作更顺畅。
怎么用:
# ✅ 好的命名:见名知意
user_age = 25
total_price = 199.9
is_logged_in = False
# ❌ 不好的命名:自己都看不懂
a = 25
x1 = 199.9
ll = False
# 特殊规则
_private_var = 100 # 下划线开头,表示「内部使用」
CONSTANT_VALUE = 3.14 # 全大写,表示「常量」(不应该改的值)
小技巧:Python 官方推荐用 snake_case(下划线连接小写字母)命名变量,比如 user_name、total_count。
基本数据类型——数据的「性格」
Python 里数据有几种「性格」,不同性格能干的事不一样。
四种基本数据类型:
| 类型 | 说明 | 示例 | 能做什么 |
|---|---|---|---|
int |
整数 | 18, -7, 0 |
加减乘除数学运算 |
float |
小数 | 3.14, -0.5 |
需要精确到小数点的计算 |
str |
字符串(文本) | "你好", 'hello' |
文字处理、拼接 |
bool |
布尔值(真假) | True, False |
条件判断 |
生活类比:
- int 像整数个数的苹果,数数用它
- float 像重量秤,能显示小数点
- str 像写在纸上的字,文本内容
- bool 像开关,只有「开/关」两种状态
为什么用:不同类型的数据操作方式不同。比如数字能加减乘除,字符串能拼接查找。
怎么用:
# int 整数 - 适合计数
apple_count = 10
orange_count = 5
total_fruits = apple_count + orange_count # 加法:15
# float 小数 - 适合精确计算
price_per_kg = 12.8
weight = 1.5
total_cost = price_per_kg * weight # 乘法:19.2
# str 字符串 - 适合文字
greeting = "你好"
name = "小明"
message = greeting + name # 拼接:"你好小明"
# bool 布尔值 - 适合判断
is_student = True
has_discount = False
can_buy = is_student or has_discount # True(学生或打折至少一个成立)
print(f"水果总数:{total_fruits}")
print(f"总价:{total_cost} 元")
print(f"问候语:{message}")
print(f"能买吗:{can_buy}")
运行结果:
水果总数:15
总价:19.2 元
问候语:你好小明
能买吗:True
type() 和 id() —— 查看数据的「身份证」
type() 查看数据类型——就像查户口本,看这个人是哪个「类型」的。
x = 42
y = 3.14
z = "hello"
w = True
print(type(x)) # <class 'int'>
print(type(y)) # <class 'float'>
print(type(z)) <class 'str'>
print(type(w)) # <class 'bool'>
id() 查看内存地址——每个数据在内存里都有一个「门牌号」。
a = 100
b = 100
print(id(a)) # 140234567890(数字每次可能不同)
print(id(b)) # 140234567890(Python 会复用相同的小整数)
c = "hello"
d = "hello"
print(id(c)) # 和 d 的 id 相同吗?试试看!
print(id(d))
小知识:Python 会对一些小整数(-5 到 256)和短字符串进行「缓存」,相同的值可能指向同一个内存地址。

🔥 实战:3 个递进小项目
项目 1:购物小票计算器(5 分钟)
场景:小明去超市买了这些东西,算算一共多少钱。
目标:学会用变量存储价格、进行运算。
# 购物清单
apple_price = 8.5 # 苹果 8.5 元/斤
banana_price = 3.2 # 香蕉 3.2 元/斤
milk_price = 6.5 # 牛奶 6.5 元/盒
bread_price = 4.8 # 面包 4.8 元/个
# 买的数量
apple_weight = 2.3 # 2.3 斤苹果
banana_weight = 1.5 # 1.5 斤香蕉
milk_count = 2 # 2 盒牛奶
bread_count = 1 # 1 个面包
# 计算各类商品的小计
apple_total = apple_price * apple_weight
banana_total = banana_price * banana_weight
milk_total = milk_price * milk_count
bread_total = bread_price * bread_count
# 计算总价
total = apple_total + banana_total + milk_total + bread_total
# 打印小票
print("=" * 30)
print(" 小 明 的 购 物 小 票")
print("=" * 30)
print(f"苹果:{apple_weight}斤 × {apple_price} = {apple_total:.2f}元")
print(f"香蕉:{banana_weight}斤 × {banana_price} = {banana_total:.2f}元")
print(f"牛奶:{milk_count}盒 × {milk_price} = {milk_total:.2f}元")
print(f"面包:{bread_count}个 × {bread_price} = {bread_total:.2f}元")
print("-" * 30)
print(f"总计:{total:.2f} 元")
print("=" * 30)
预期输出:
==============================
小 明 的 购 物 小 票
==============================
苹果:2.3斤 × 8.5 = 19.55元
香蕉:1.5斤 × 3.2 = 4.80元
牛奶:2盒 × 6.5 = 13.00元
面包:1个 × 4.8 = 4.80元
------------------------------
总计:42.15 元
==============================
一句话解释:用变量存价格和数量,然后乘加运算得到总价。{apple_total:.2f} 中的 .2f 表示保留 2 位小数。
项目 2:学生成绩统计(15 分钟)
场景:老师有一份学生成绩单(用字典模拟),计算平均分、最高分、最低分。
目标:学会处理多个同类型数据,用 int/float 运算。
# 学生成绩数据(字典类型,后面会详细讲,这里先用着)
student_scores = {
"小明": 85,
"小红": 92,
"小刚": 78,
"小李": 95,
"小王": 88
}
# 取出所有分数
scores = list(student_scores.values())
names = list(student_scores.keys())
# 计算统计数据
total_score = sum(scores) # 总分:sum() 是内置函数,求和
average_score = total_score / len(scores) # 平均分:len() 是内置函数,计数
max_score = max(scores) # 最高分
min_score = min(scores) # 最低分
# 找出最高分和最低分对应的学生
max_student = [name for name, score in student_scores.items() if score == max_score]
min_student = [name for name, score in student_scores.items() if score == min_score]
# 打印成绩单
print("=" * 35)
print(" 第 一 次 月 考 成 绩 单")
print("=" * 35)
for name, score in student_scores.items():
# 根据分数显示评级
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "D"
print(f"{name}:{score}分 | 评级:{grade}")
print("-" * 35)
print(f"平均分:{average_score:.1f} | 最高分:{max_score} | 最低分:{min_score}")
print(f"最高分学生:{', '.join(max_student)}")
print(f"最低分学生:{', '.join(min_student)}")
print("=" * 35)
预期输出:
===================================
第 一 次 月 考 成 绩 单
===================================
小明:85分 | 评级:B
小红:92分 | 评级:A
小刚:78分 | 评级:C
小李:95分 | 评级:A
小王:88分 | 评级:B
-----------------------------------
平均分:87.6 | 最高分:95 | 最低分:78
最高分学生:小李
最低分学生:小刚
===================================
一句话解释:sum()、max()、min()、len() 都是 Python 内置函数,直接就能用,省去自己写循环的麻烦。
项目 3:个人开销记录工具(15 分钟)
场景:记录一周的每天开销,统计每周总开销、平均日开销,找出哪天花得最多。
目标:组合多个数据处理技能,写一个真正有用的小工具。
# 一周开销记录(模拟从文件或数据库读取的数据)
weekly_expenses = {
"周一": 45.5,
"周二": 32.0,
"周三": 68.8,
"周四": 25.0,
"周五": 89.2,
"周六": 156.0,
"周日": 42.5
}
# ==================== 数据处理 ====================
# 1. 计算总开销
total = sum(weekly_expenses.values())
# 2. 计算平均日开销
daily_average = total / len(weekly_expenses)
# 3. 找出最高开销和最低开销
max_day = max(weekly_expenses, key=weekly_expenses.get)
max_amount = weekly_expenses[max_day]
min_day = min(weekly_expenses, key=weekly_expenses.get)
min_amount = weekly_expenses[min_day]
# 4. 判断这周开销是否超标(假设每天预算 60 元)
daily_budget = 60.0
is_over_budget = total > daily_budget * 7
# ==================== 输出报告 ====================
print("=" * 40)
print(" 💰 小 明 的 周 开 销 报 告")
print("=" * 40)
# 逐天列出
print("\n📅 每日开销:")
for day, amount in weekly_expenses.items():
# 超出预算的日期标出来
if amount > daily_budget:
marker = " ⚠️ 超预算"
else:
marker = ""
print(f" {day}:{amount:>6.1f} 元{marker}")
# 统计信息
print("\n📊 统计摘要:")
print(f" 总开销:{total:.1f} 元")
print(f" 日均:{daily_average:.1f} 元")
print(f" 最高:{max_day}({max_amount:.1f} 元)")
print(f" 最低:{min_day}({min_amount:.1f} 元)")
# 预算提醒
print("\n💡 预算提醒:")
if is_over_budget:
over_amount = total - daily_budget * 7
print(f" ⚠️ 本周超支了 {over_amount:.1f} 元!")
else:
save_amount = daily_budget * 7 - total
print(f" ✅ 本周结余 {save_amount:.1f} 元,继续保持!")
print("=" * 40)
预期输出:
========================================
💰 小 明 的 周 开 销 报 告
========================================
📅 每日开销:
一: 45.5 元
二: 32.0 元
三: 68.8 元 ⚠️ 超预算
四: 25.0 元
五: 89.2 元 ⚠️ 超预算
六: 156.0 元 ⚠️ 超预算
日: 42.5 元
📊 统计摘要:
开销:458.0 元
均: 65.4 元
高:周六(156.0 元)
低:周四(25.0 元)
💡 预算提醒:
️ 本周超支了 38.0 元!
========================================
一句话解释:把数据存到字典里,用 sum()/max()/min() 做统计,再用 if 判断生成提醒——这就是数据处理的基本套路。
💪 进阶:常见坑 + 调试技巧
坑 1:字符串和数字不能直接相加
# ❌ 错误示例
age = "25" # 注意:这是字符串,不是数字!
print("我的年龄是 " + age) # 这样可以,因为都是字符串
# 但这样就不行了:
# print("明年" + (age + 1)) # 报错!字符串不能直接和数字相加
# ✅ 正确做法:先转换类型
age = 25 # int 类型
print("明年我 " + str(age + 1) + " 岁") # 先算出结果,再转字符串
# 或者用 f-string 更方便:
print(f"明年我 {age + 1} 岁")
坑 2:浮点数精度问题
# ❌ 错误示例
a = 0.1
b = 0.2
print(a + b == 0.3) # False!原因是浮点数精度问题
# ✅ 正确做法:使用 round() 或 decimal 模块
print(round(a + b, 2) == 0.3) # True(保留2位小数比较)
# 或者
from decimal import Decimal
print(Decimal('0.1') + Decimal('0.2') == Decimal('0.3')) # True
解释:0.1 + 0.2 在计算机里实际上是 0.30000000000000004,这是二进制浮点数的固有局限。
坑 3:变量名大小写写错
# ❌ 错误示例
userName = "小明"
print(username) # 报错:NameError: name 'username' is not defined
# ✅ 正确做法:保持命名风格一致
user_name = "小明"
print(user_name) # 正常
坑 4:把 = 和 == 搞混
# ❌ 错误示例
age = 25
if age = 30: # 报错!赋值语句不能用于判断
print("你30岁了")
# ✅ 正确做法:判断用 ==
age = 25
if age == 30:
print("你30岁了")
else:
print(f"你{age}岁,不是30岁")
坑 5:bool 类型的「隐形陷阱」
# ❌ 错误示例
is_empty = "" # 空字符串,在判断中是 False
if is_empty:
print("不为空")
else:
print("是空的") # 会走到这里
# 但有时候需要区分「空」和「未定义」:
is_empty = None # None 表示「没有值」
# ✅ 正确做法:明确检查
if is_empty is None:
print("值未定义")
elif is_empty == "":
print("是空字符串")
else:
print(f"内容是:{is_empty}")
调试技巧:print 大法
代码跑不通?先加几个 print 看看变量当前的值:
def calculate(a, b):
result = a + b
print(f"DEBUG: a={a}, b={b}, result={result}") # 打印中间值
return result
calculate(5, 3)
# 输出:DEBUG: a=5, b=3, result=8
什么时候用:print 适合快速定位问题,正式项目里可以用 logging 模块替代。
✏️ 练习题
练习 1(2 分钟):改改价格
基础题,直接改项目 1 的代码。
- 输入:把
apple_price改成12.8 - 预期输出:苹果那行的计算结果变成
29.44元 - 提示:只需要改一个数字,然后运行看看结果
练习 2(2 分钟):加个判断
基础题,在项目 1 基础上加 if 判断。
- 输入:如果总价超过 50 元,打印「老板,打折!」
- 预期输出:购物小票底部多一行「老板,打折!」
- 提示:用
if total > 50:判断,然后print()
练习 3(3 分钟):新数据统计
进阶题,用项目 2 的方法统计新的成绩。
- 输入:新增学生「小张:82」「小刘:91」
- 预期输出:平均分更新为
(85+92+78+95+88+82+91)/7 = 87.3 - 提示:直接在
student_scores字典里加两个键值对
练习 4(5 分钟):串起两个项目
进阶题,把项目 2 和项目 3 的逻辑组合。
- 输入:用项目 3 的开销逻辑,但计算的是「学习时间」而不是钱(分钟)
- 预期输出:一份「一周学习时间报告」,包含每日学习时长、总时长、平均时长、最高/最低学习日
- 提示:把「元」换成「分钟」,把「预算」换成「目标」(比如每天目标 120 分钟)
练习 5(5 分钟):读懂报错
挑战题,给你一个报错信息分析原因。
Traceback (most recent call last):
File "test.py", line 5, in <module>
print("总和是:" + total)
TypeError: can only concatenate str (not "int") to str
- 输入:上面的代码报错,哪行有问题?怎么改?
- 预期输出:说出错误原因,并给出正确代码
- 提示:错误类型是
TypeError,提示是「字符串只能和字符串拼接」,所以要把total转成str(total)
📚 总结 + 资源
一句话总结本文学到的 3 个核心点:
- 变量是数据的「标签」:给数据起个有意义的名字,方便记忆和使用
- 数据类型决定操作方式:
int/float做数学运算,str做文字处理,bool做判断 - 善用内置函数:
sum()、max()、min()、len()可以快速完成统计,不用自己写循环
延伸学习资源:
- Python 官方文档:内置类型 —— 最权威的中文参考
- 《Python 编程:从入门到实践》第一章 —— 入门经典教材,知识点讲解很细
- Real Python: Python Data Types —— 进阶阅读,帮你深入理解
互动钩子:
你是做什么工作的?有没有遇到过「明明是数字却不能相加」或者「类型报错」的情况?评论区聊聊你的踩坑经历,老粉优先回复! 👇
下章预告:
学会了存数字、存文字,下一章我们要学的是——怎么把这些数据「拼」成你想要的样子输出。比如购物小票怎么排版、统计报告怎么显示更美观……这就是「字符串与 f-string 格式化」要解决的问题。敬请期待!

评论(0)