Python启蒙 · 语法小讲堂
语法不必一次讲完,
在代码需要它时再认识它。
每次只讲一个概念。先让孩子看到代码效果,再给已经见过的东西补上名字,最后马上改一处代码。
这张网页怎么使用
课前
老师先看边界
知道本次讲到哪里就停,避免把一节课变成术语课。
课堂
先运行再投屏
孩子先看到作品变化,再用一句话和一张图解释。
马上
只改一个地方
改名字、数字或规则,再运行一次验证自己的猜想。
课程穿插地图
遇到问题时,再引入概念
Day 1
字面量初见
第一次运行成功后,认识代码里直接写出的文字和数字。
Day 3
注释正式登场
组合墙、屋顶和门窗时,给代码留下清楚的说明。
Day 4
标识符与函数名
已经给动作起过名字,再总结合法名字和snake_case。
Day 5
变量与赋值
遇到重复修改的麻烦后,用一个名字统一控制多个位置。
Day 6
认识关键字
第一次使用if与else,只认识当前真正需要的两个单词。
Day 8
常量与游戏规则
小游戏规则变多后,再整理移动距离、碰撞距离和获胜分数。
Day 9
数据类型
分数、速度和提示文字一起出现后,再认识int、float和str。
延伸
整型
顺着分数和倒计时补充整数、数字分组和Python整数的范围。
延伸
浮点型
宝石大小、速度或温度出现小数时,再正式认识float。
Day 9
字符串与 f-string
计分板要把提示文字和分数组合起来时,优先使用f-string。
按需
字符编码
只有遇到乱码或保存中文文件时,才解释UTF-8这套翻译规则。
01 · Day 1第一次正式讲
字面量:直接写出来的值
先让孩子认出代码里的文字和数字,再给这些具体值补上“字面量”这个名字。
t.color("royalblue")
t.forward(100)
t.left(90)8—11岁这样说
“引号里的文字和直接写出的数字,都是代码里具体写出来的内容。”
12—16岁这样说
“直接写进代码的具体值叫字面量。这里分别出现了字符串和整数。”
马上改一改
把 royalblue 和 100 换成自己喜欢的颜色与距离,再运行一次。
讲到这里就停:第一次只统一使用英文双引号,不展开三引号、转义字符和数据类型体系。
03 · Day 4第一次正式讲
标识符:程序里的名字
孩子已经给动作起过名字,这时再解释变量名、函数名、类名和常量名都属于标识符。
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第一次正式讲
变量:给数据贴一张名牌
先制造“同一个数字要改很多次”的麻烦,再让变量成为解决问题的工具。
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 预订的单词
在孩子第一次真正使用 if 和 else 时,再告诉他这些单词已经被 Python 拿去工作了。
if house_size > 100:
wall_color = "tomato"
else:
wall_color = "lightblue"8—11岁这样说
“if 和 else 是 Python 已经预订的单词,不能再拿来给变量起名字。”
12—16岁这样说
“关键字是 Python 保留并赋予特殊语法作用的单词,不能作为标识符。”
马上改一改
用中文先说出“如果房子大就用红色,否则用蓝色”,再对照四行代码。
讲到这里就停:不要求背关键字表;在实际代码中遇到一个,就认识一个。
06 · Day 8第一次正式讲
常量:给游戏规则起名字
小游戏出现移动距离、获胜分数和碰撞距离后,再把散落的数字整理成大写规则名。
MOVE_STEP = 20
WINNING_SCORE = 5
COLLISION_DISTANCE = 20
current_score = 08—11岁这样说
“大写名字像游戏规则牌:游戏开始后,我们约定不随便改它。”
12—16岁这样说
“Python 不强制保护常量;UPPER_SNAKE_CASE 是程序员表达“运行时不应重新赋值”的约定。”
马上改一改
把 WINNING_SCORE 从 5 改成 10,运行游戏并说明哪条规则发生了变化。
讲到这里就停:强调“约定不修改”,不要把常量误讲成 Python 会自动锁住的值。
07 · 遇到乱码时再讲
字符编码:文字的翻译规则
只有当孩子真的遇到乱码,或开始保存带中文的文件时,才解释电脑怎样保存和读回文字。
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顺着分数和倒计时讲
数据类型:数据也有自己的分类
游戏里已经同时出现分数、速度和提示文字,这时再给整数、浮点数和字符串补上正式名字。
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 · 数据类型之后按需补充
整型:没有小数点的数字
用游戏分数和倒计时认识 int,再用下划线把很大的整数分组写清楚。
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 · 出现速度、大小或温度的小数时再讲
浮点型:带小数点的数字
当孩子用 0.8 调整宝石大小、用 2.5 表示速度时,再认识 float 这个名字。
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 讲
字符串:把文字装进引号
游戏已经要显示名字、分数和胜利消息,这时再认识 str,并用 f-string 把文字和数据组合起来。
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}"。
现在回到作品里
语法小讲堂不是新的学习主线。选好年龄轨道,从作品开始;需要某个概念时,再回到这里看一眼。
模块目录
Python 启蒙
02 · Day 3第一次正式讲
注释:给未来的自己留纸条
孩子开始组合墙、屋顶和门窗时,再正式认识代码里灰色的说明文字。
8—11岁这样说
“# 后面是写给人看的小纸条,Python 看见它会跳过去。”
12—16岁这样说
“注释不参与程序执行。好注释优先解释“为什么这样做”,而不是重复代码。”
马上改一改
给房子的“墙”和“屋顶”各写一行注释,提醒下一次打开代码的自己。
讲到这里就停:Python 没有真正的多行注释语法;三引号是字符串,留到文档字符串课程再讲。