Python启蒙 · 语法小讲堂

语法不必一次讲完,在代码需要它时再认识它。

每次只讲一个概念。先让孩子看到代码效果,再给已经见过的东西补上名字,最后马上改一处代码。

每次5—8分钟先运行,后解释讲完马上改代码

这张网页怎么使用

课前

老师先看边界

知道本次讲到哪里就停,避免把一节课变成术语课。

课堂

先运行再投屏

孩子先看到作品变化,再用一句话和一张图解释。

马上

只改一个地方

改名字、数字或规则,再运行一次验证自己的猜想。

课程穿插地图

遇到问题时,再引入概念

不单独占用一整节课

01 · Day 1第一次正式讲

字面量:直接写出来的值

5 分钟

先让孩子认出代码里的文字和数字,再给这些具体值补上“字面量”这个名字。

python
t.color("royalblue")
t.forward(100)
t.left(90)

8—11岁这样说

引号里的文字和直接写出的数字,都是代码里具体写出来的内容。

12—16岁这样说

直接写进代码的具体值叫字面量。这里分别出现了字符串和整数。

马上改一改

把 royalblue 和 100 换成自己喜欢的颜色与距离,再运行一次。

讲到这里就停:第一次只统一使用英文双引号,不展开三引号、转义字符和数据类型体系。

02 · Day 3第一次正式讲

注释:给未来的自己留纸条

5 分钟

孩子开始组合墙、屋顶和门窗时,再正式认识代码里灰色的说明文字。

python
# 画房子的墙
t.fillcolor("lightblue")
 
# 画完后抬起画笔
t.penup()

8—11岁这样说

# 后面是写给人看的小纸条,Python 看见它会跳过去。

12—16岁这样说

注释不参与程序执行。好注释优先解释“为什么这样做”,而不是重复代码。

马上改一改

给房子的“墙”和“屋顶”各写一行注释,提醒下一次打开代码的自己。

讲到这里就停:Python 没有真正的多行注释语法;三引号是字符串,留到文档字符串课程再讲。

03 · Day 4第一次正式讲

标识符:程序里的名字

8 分钟

孩子已经给动作起过名字,这时再解释变量名、函数名、类名和常量名都属于标识符。

python
def draw_house():
    t.forward(100)
 
draw_house()

8—11岁这样说

draw_house 是我们给“画房子”这个动作起的名字,单词之间用下划线连接。

12—16岁这样说

程序员给变量、函数和类等起的合法名字统称标识符;名字还要清楚、有描述性。

马上改一改

把 draw_house 改成 draw_small_house,并找出所有需要一起修改的位置。

讲到这里就停:变量名和函数名先统一使用 snake_case;类名等学到 class 时再正式展开。

04 · Day 5第一次正式讲

变量:给数据贴一张名牌

8 分钟

先制造“同一个数字要改很多次”的麻烦,再让变量成为解决问题的工具。

python
house_size = 80
wall_color = "lightblue"
 
draw_house(-200, 0, house_size, wall_color)

8—11岁这样说

变量像一张名牌:house_size 这张名牌现在代表 80。

12—16岁这样说

变量名与一个值建立绑定;重新赋值会让这个名字改为代表一个新值。

马上改一改

只修改 house_size 和 wall_color 两行,观察整座村子怎样一起变化。

讲到这里就停:Starter 不展开内存地址、对象模型以及可变与不可变对象。

05 · Day 6第一次正式讲

关键字:被 Python 预订的单词

5 分钟

在孩子第一次真正使用 if 和 else 时,再告诉他这些单词已经被 Python 拿去工作了。

python
if house_size > 100:
    wall_color = "tomato"
else:
    wall_color = "lightblue"

8—11岁这样说

if 和 else 是 Python 已经预订的单词,不能再拿来给变量起名字。

12—16岁这样说

关键字是 Python 保留并赋予特殊语法作用的单词,不能作为标识符。

马上改一改

用中文先说出“如果房子大就用红色,否则用蓝色”,再对照四行代码。

讲到这里就停:不要求背关键字表;在实际代码中遇到一个,就认识一个。

06 · Day 8第一次正式讲

常量:给游戏规则起名字

8 分钟

小游戏出现移动距离、获胜分数和碰撞距离后,再把散落的数字整理成大写规则名。

python
MOVE_STEP = 20
WINNING_SCORE = 5
COLLISION_DISTANCE = 20
 
current_score = 0

8—11岁这样说

大写名字像游戏规则牌:游戏开始后,我们约定不随便改它。

12—16岁这样说

Python 不强制保护常量;UPPER_SNAKE_CASE 是程序员表达“运行时不应重新赋值”的约定。

马上改一改

把 WINNING_SCORE 从 5 改成 10,运行游戏并说明哪条规则发生了变化。

讲到这里就停:强调“约定不修改”,不要把常量误讲成 Python 会自动锁住的值。

07 · 遇到乱码时再讲

字符编码:文字的翻译规则

5 分钟

只有当孩子真的遇到乱码,或开始保存带中文的文件时,才解释电脑怎样保存和读回文字。

python
message = "你好,Python!"
print(message)

8—11岁这样说

电脑保存文字时会把它翻译成数字,读取时再翻译回来。两次使用同一种规则,文字才不会变乱。

12—16岁这样说

Unicode 给字符分配编号,UTF-8 负责把这些编号编码成字节。Python 3 源文件默认使用 UTF-8。

马上改一改

在 Thonny 中运行这两行中文,再确认编辑器保存文件时使用的是 UTF-8。

讲到这里就停:不要求背 ASCII、GBK 等编码表,也不必默认添加编码声明;Python 3 文件通常直接使用 UTF-8。

08 · Day 9顺着分数和倒计时讲

数据类型:数据也有自己的分类

8 分钟

游戏里已经同时出现分数、速度和提示文字,这时再给整数、浮点数和字符串补上正式名字。

python
score = 5
speed = 2.5
message = "你赢了!"
 
print(type(score))
print(type(speed))
print(type(message))

8—11岁这样说

5 是不带小数点的整数,2.5 是带小数点的浮点数,引号里的“你赢了”是字符串。

12—16岁这样说

值有类型,变量名可以重新绑定不同的值。type() 查看的是变量当前所绑定对象的类型。

马上改一改

依次把 score 改成 5、5.0 和 "5",每次运行并观察 type(score) 的结果。

讲到这里就停:本次只认识 int、float、str;列表、字典、布尔值等类型在作品真正需要时再讲。

09 · 数据类型之后按需补充

整型:没有小数点的数字

5 分钟

用游戏分数和倒计时认识 int,再用下划线把很大的整数分组写清楚。

python
score = 5
time_left = 30
big_number = 10_000_000
 
print(type(score))
print(big_number)

8—11岁这样说

没有小数点的数字叫整数,正数、0 和负数都可以是整数。

12—16岁这样说

Python 整数没有固定的最大位数,实际大小受可用内存限制;数字中的下划线只帮助阅读。

马上改一改

把 10_000_000 改成 1_000_000,并猜一猜打印时下划线会不会出现。

讲到这里就停:先不演示 9 ** 9999。Python 3.11 的“4300 digits”限制针对超大整数与十进制字符串的转换,不是整数运算上限。

10 · 出现速度、大小或温度的小数时再讲

浮点型:带小数点的数字

5 分钟

当孩子用 0.8 调整宝石大小、用 2.5 表示速度时,再认识 float 这个名字。

python
gem_size = 0.8
player_speed = 2.5
temperature = -25.2
 
print(type(gem_size))

8—11岁这样说

带小数点的数字叫浮点数,2.0 虽然看起来像整数,但它仍然是 float。

12—16岁这样说

float 可以直接写成 3.14,也可以用科学计数法:3.4e2 表示 3.4 × 10²,1e-3 表示 1 × 10⁻³。

马上改一改

把 gem_size 依次改成 0.5、1.0 和 2.0,每次运行并观察 type(gem_size) 的结果。

讲到这里就停:启蒙版只讲直接小数;科学计数法放在挑战扩展。浮点数的精度问题等实际遇到再解释。

11 · Day 9顺着计分板的 f-string 讲

字符串:把文字装进引号

8 分钟

游戏已经要显示名字、分数和胜利消息,这时再认识 str,并用 f-string 把文字和数据组合起来。

python
single = '你好'
double = "Python"
multiline = """第一行
第二行"""
 
name = "小海"
score = 5
message = f"{name} 得了 {score} 分!"
print(message)

8—11岁这样说

引号像文字的外包装。单引号和双引号都可以,课程中统一使用双引号,更容易保持一致。

12—16岁这样说

三引号创建可换行的字符串,它不是注释;只有放在模块、类或函数的特定开头位置时,才会成为文档字符串。

马上改一改

修改 name 和 score,用 f-string 生成自己的胜利消息,例如“小海得了 8 分!”。

讲到这里就停:启蒙课不讲 % 占位符和 m.n 精度控制。真正要显示一位小数时,直接使用现代 f-string:f"{weight:.1f}"。

现在回到作品里

语法小讲堂不是新的学习主线。选好年龄轨道,从作品开始;需要某个概念时,再回到这里看一眼。