第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。

配图1 - 配图1


标识符命名规范——给变量起名字的规矩

生活类比:起名字不能乱起,要符合规则。比如人名不能用数字开头、不能用特殊符号。

Python 里起变量名(标识符)也有规则

规则 正确示例 错误示例 原因
字母或下划线开头 name, _count 2nd_place 数字不能开头
只能有字母、数字、下划线 user_name, age1 user-name, my age 短横线和空格是「非法字符」
大小写敏感 Namename 是两个变量 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_nametotal_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)和短字符串进行「缓存」,相同的值可能指向同一个内存地址。

配图2 - 配图2


🔥 实战: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 个核心点

  1. 变量是数据的「标签」:给数据起个有意义的名字,方便记忆和使用
  2. 数据类型决定操作方式int/float 做数学运算,str 做文字处理,bool 做判断
  3. 善用内置函数sum()max()min()len() 可以快速完成统计,不用自己写循环

延伸学习资源

  1. Python 官方文档:内置类型 —— 最权威的中文参考
  2. 《Python 编程:从入门到实践》第一章 —— 入门经典教材,知识点讲解很细
  3. Real Python: Python Data Types —— 进阶阅读,帮你深入理解

互动钩子

你是做什么工作的?有没有遇到过「明明是数字却不能相加」或者「类型报错」的情况?评论区聊聊你的踩坑经历,老粉优先回复! 👇


下章预告

学会了存数字、存文字,下一章我们要学的是——怎么把这些数据「拼」成你想要的样子输出。比如购物小票怎么排版、统计报告怎么显示更美观……这就是「字符串与 f-string 格式化」要解决的问题。敬请期待!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。