零基础起步:第一次写 Python
6 个关卡,每一步都写清「做什么 / 敲什么 / 你应该看到 / 报错怎么办」。全程约 40 分钟。
关卡目录
第 0 关 · 装 Python、跑起来(5 分钟)
前提:一台 Windows / macOS 电脑
1① 安装并验证
🎯 官网下载 Python 3.10+,安装时务必勾选 “Add python.exe to PATH”。
python --version
pip --versionPython 3.11.4 pip 23.1.2
两条都出版本号就成功了。
'python' 不是内部或外部命令→ 没勾 PATH;重装勾选 PATH,或命令行用 py -3Microsoft Store 弹出→ 系统里有应用别名;设置 → 应用执行别名 → 关掉 python.exe 别名
2② 进入交互模式试一句
🎯 输入 python 回车,出现 >>> 就可以写代码了;exit() 退出。
python
>>> print("Hello, Python")
>>> 2 ** 10
>>> exit()Hello, Python 1024
交互模式适合试一小段,正式程序要写进 .py 文件。
3③ 写第一个脚本
🎯 用记事本或 VS Code 新建 hello.py,内容如下,然后在命令行运行。
print("你好,Python!")
name = input("你叫什么?")
print(f"欢迎你,{name}")你好,Python! 你叫什么?小明 欢迎你,小明
保存时编码选 UTF-8,中文才不会乱码。
第 1 关 · 变量、类型与输入输出(6 分钟)
前提:第 0 关完成
1① 变量与类型
🎯 Python 不用声明类型,直接用;type() 可以查看。
age = 20
price = 19.9
name = "张三"
ok = True
print(type(age), type(price), type(name))<class 'int'> <class 'float'> <class 'str'>
int 整数、float 小数、str 字符串、bool 布尔。
2② 输入与转换
🎯 input 得到的永远是字符串,算数要先 int()/float()。
a = int(input("第一个数:"))
b = int(input("第二个数:"))
print("和 =", a + b)第一个数:3 第二个数:4 和 = 7
不转换直接相加会得到 "34"(字符串拼接)。
ValueError: invalid literal for int()→ 输入了非数字;先 str.isdigit() 判断或用 try/except
3③ 格式化输出
🎯 f-string 是最推荐的拼接方式。
name, score = "李四", 92.456
print(f"{name} 的成绩:{score:.1f}")李四 的成绩:92.5
:.1f 表示保留 1 位小数。
第 2 关 · 条件与循环(7 分钟)
前提:第 1 关完成
1① if 判断
🎯 注意冒号与缩进。
score = 85
if score >= 90:
print("优秀")
elif score >= 60:
print("及格")
else:
print("不及格")及格
从上往下判断,命中一个就结束。
SyntaxError: expected ':'→ if 行末少了冒号;补英文冒号IndentationError→ 缩进不统一;统一 4 个空格
2② for 循环
🎯 遍历序列或按次数循环。
total = 0
for i in range(1, 101):
total += i
print("1~100 的和 =", total)1~100 的和 = 5050
range(1, 101) 是 1 到 100(不含 101)。
3③ while 与 break
🎯 次数不确定时用 while,配合 break 退出。
n = 0
while True:
n += 1
if n == 3:
break
print(n, end=" ")1 2
break 直接跳出循环。
第 3 关 · 列表与字典(7 分钟)
前提:第 2 关完成
1① 列表增删改查
🎯 最常用:append / remove / 切片 / for 遍历。
scores = [88, 92, 76]
scores.append(95)
print(scores, len(scores))
print(scores[:2])[88, 92, 76, 95] 4 [88, 92]
切片左闭右开,越界不报错。
2② 字典与遍历
🎯 键值对组合,适合一条记录。
stu = {"name": "张三", "score": 89}
stu["age"] = 20
for k, v in stu.items():
print(k, "=", v)name = 张三 score = 89 age = 20
get("不存在的键") 返回 None,不会报错。
KeyError: 'age'→ 用了不存在的键;改用 stu.get("age")
3③ 列表 + 字典组合
🎯 最常见的数据结构:列表里装字典。
students = [{"name": "张三", "score": 89}, {"name": "李四", "score": 92}]
for s in students:
print(s["name"], s["score"])张三 89 李四 92
后面处理 CSV/JSON 数据就是这个形状。
第 4 关 · 函数(5 分钟)
前提:第 3 关完成
1① 定义与调用
🎯 def 定义、return 返回。
def average(scores):
if not scores:
return 0
return sum(scores) / len(scores)
print(average([90, 80, 70]))80.0
没有 return 的函数返回 None。
2② 默认参数
🎯 调用时可省略有默认值的参数。
def greet(name, greeting="你好"):
return f"{greeting},{name}"
print(greet("张三"))
print(greet("李四", "早上好"))你好,张三 早上好,李四
默认值不要用 [] 或 {} 这类可变对象。
3③ 拆分文件
🎯 把函数放进 utils.py,另一个文件 import 使用。
# utils.py
def average(scores):
return sum(scores) / len(scores) if scores else 0
# main.py
from utils import average
print(average([90, 80, 70]))80.0
同目录下直接 import 即可。
第 5 关 · 读文件、画图(8 分钟)
前提:第 4 关完成
1① 读 CSV 文件
🎯 先准备 scores.csv(姓名,科目,分数),用 csv.DictReader 读成字典。
import csv
with open("scores.csv", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
print(len(rows), rows[0] if rows else "空文件")(行数) {'姓名': '张三', '科目': '语文', '分数': '88'}csv 读出来都是字符串,需要数字时用 float() 转。
2② 分组统计
🎯 按科目分组求平均分。
from statistics import mean
groups = {}
for r in rows:
groups.setdefault(r["科目"], []).append(float(r["分数"]))
for k, v in groups.items():
print(k, round(mean(v), 1))语文 86.0 数学 91.5
setdefault 是“不存在就建空列表”的标准写法。
3③ 画柱状图
🎯 需要先 pip install matplotlib。
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
subs = list(groups)
avgs = [round(mean(v), 1) for v in groups.values()]
plt.bar(subs, avgs)
plt.title("各科平均分")
plt.savefig("bar.png", dpi=150)
print("已生成 bar.png")已生成 bar.png
中文不设置字体会显示成方框。
ModuleNotFoundError: No module named 'matplotlib'→ 没装库;pip install matplotlib中文显示成方框→ 没设中文字体;plt.rcParams["font.sans-serif"] = ["SimHei"]
常见报错速查 Ctrl+F 搜关键字
| 报错 | 原因 | 解决 |
|---|---|---|
| SyntaxError: invalid syntax | 括号/引号不配对、少了冒号、中文标点 | 检查标点是否为英文、括号是否成对 |
| IndentationError: unexpected indent / expected an indented block | 缩进不一致或该缩进时没缩进 | 统一 4 个空格,不要混 Tab |
| NameError: name 'xxx' is not defined | 变量名拼错或未赋值 | 检查拼写与作用域 |
| TypeError: can only concatenate str (not "int") to str | 字符串与数字直接相加 | 用 f-string 或 str() 转换 |
| ValueError: invalid literal for int() with base 10 | 把非数字字符串转 int | 先判断 isdigit() 或用 try/except |
| IndexError: list index out of range | 下标越界 | 用 len() 检查,或改用 for 遍历 |
| KeyError: 'xxx' | 字典里没有这个键 | 改用 dict.get(k) 或先判断 in |
| AttributeError: 'list' object has no attribute 'xxx' | 调用了该类型不存在的方法 | 查文档确认方法名(列表没有 split) |
| TypeError: unhashable type: 'list' | 把列表放进集合/当字典键 | 转成 tuple |
| ModuleNotFoundError: No module named 'xxx' | 库没装或模块不在路径 | pip install,或检查文件名/目录 |
| FileNotFoundError: [Errno 2] No such file or directory | 路径不对或没建文件 | 用绝对路径或 Path(__file__).parent |
| UnicodeDecodeError: 'gbk' codec can't decode | 读文件没指定 UTF-8 | open(..., encoding="utf-8") |
| RecursionError: maximum recursion depth exceeded | 递归没有终止条件 | 补 if 终止分支 |
| ZeroDivisionError: division by zero | 除数为 0 | 先判断分母是否为 0 |
完成自检清单
- ☐ 能用 python 命令运行脚本
- ☐ 能声明变量、做类型转换、用 f-string 输出
- ☐ 能写 if 分支与 for/while 循环
- ☐ 能用列表装数据、用字典按名取值
- ☐ 能写带参数与返回值的函数
- ☐ 能读 CSV 文件并统计、用 matplotlib 出图
- ☐ 看到报错能定位到行号与错误类型