一个学生看到一道数学题,很快就知道应该怎么做。
求平均数。
计算百分比。
比较两个结果。
代入公式。
在纸上,他可能几分钟甚至几十秒就能得到正确答案。
但是,如果把要求改成:
请用 Python 写出这个问题的解决过程。
同一个学生却可能突然停下来。
第一行应该写什么?
哪些数需要定义为变量?
应该先计算哪一步?
中间结果要不要保存?
什么时候需要 if?
什么时候需要循环?
这时,我们很容易得出一个结论:
这个学生不会 Python。
但问题未必这么简单。
他可能已经理解了数学,也掌握了一些 Python 语法。
真正缺少的,是另一种能力:
把自己脑中的解题思路展开成计算机可以一步一步执行的过程。
“我会做”并不等于“我能把过程完整表达出来”
来看一个简单的例子。
三个数:
12、18、30。
求它们的平均数。
学生可能直接写:
[
(12 + 18 + 30) / 3 = 20
]
对于一个理解平均数概念的人来说,这已经足够了。
我们知道为什么要相加。
也知道为什么除以 3。
很多思考过程根本不需要写出来。
但如果让计算机完成同样的任务,我们必须把过程表达得更明确:
a = 12
b = 18
c = 30
total = a + b + c
average = total / 3
print(average)数学知识没有改变。
改变的是表达思维的方式。
在人脑中可以被压缩的一系列步骤,现在必须被展开。
人脑可以跳步,程序不能
学生在纸上计算时,常常会自动完成很多没有写出来的操作。
例如:
一件商品原价 500 元,打八折后多少钱?
一个理解百分比的学生可能马上想到:
[
500 \times 0.8 = 400
]
甚至不需要明确写出“折扣金额”。
但是,在程序中,我们可以把整个过程拆开:
price = 500
discount_rate = 20
discount = price * discount_rate / 100
final_price = price - discount
print(final_price)这里出现了几个不同的对象:
- 原价;
- 折扣比例;
- 折扣金额;
- 最终价格。
人脑可能把这些关系压缩成一个熟悉的计算。
而编程要求学生明确回答:
每一个量是什么?它从哪里来?它和下一步有什么关系?
这正是很多困难出现的地方。
数学答案和计算过程不是同一层知识
学校里的数学学习很容易让学生把注意力集中在答案上。
答案是多少?
公式有没有用对?
最后的数字对不对?
但程序设计提出了另一个问题:
这个答案是怎样产生的?
这两个问题并不相同。
假设:
x = 10
y = 20
print(x + y / 2)学生本来想求两个数的平均值。
他的数学想法可能完全正确:
先把两个数相加,再除以 2。
但实际代码表达的是:
[
10 + (20 / 2)
]
而不是:
[
(10 + 20) / 2
]
正确写法应该是:
average = (x + y) / 2
print(average)当然,我们可以告诉学生:
“这里少了括号。”
但这只是修改了一个错误。
更重要的问题是:
为什么学生脑中的正确数学关系,在变成代码时发生了变化?
这才是值得诊断的地方。
Python 不知道你“本来想表达什么”
人与人交流时,可以依靠语境。
一句话即使没有把所有信息说出来,对方往往也能理解。
我们会自动补充缺失的信息。
会根据经验推断说话者的意思。
甚至会忽略一些不影响理解的小错误。
计算机不会这样做。
它不会想:
“这个学生大概是想先把两个数加起来。”
它只执行已经写出的指令。
因此,编程迫使学生面对一个非常重要的问题:
我的想法是否已经被表达得足够明确?
这也是为什么编程不仅是在学习命令和语法。
它同时训练一种更严格的思维表达方式。
在数学题和 Python 之间,还有一个经常被忽略的层次
我们有时把学习过程想成:
数学题 → Python
实际上,中间还有几个重要阶段:
题目 → 理解题意 → 数学模型 → 运算步骤 → 算法 → 代码 → 验证
任何一个阶段都可能出现问题。
学生可能正确理解题目,但不知道应该建立什么数学关系。
也可能数学模型完全正确,却不知道怎样把它拆成步骤。
还可能算法已经清楚,只是在 Python 语法上出错。
甚至程序可以正常运行,但它解决的根本不是原来的问题。
所以:
代码错了,并不能自动说明学生的 Python 不好。
我们必须知道错误究竟从哪一层开始。
会写 Python 语法,也不一定会把数学问题程序化
学生可能已经学过:
- 变量;
input();print();if条件;- 循环;
- 函数。
如果练习明确要求:
“请使用
if。”
他可能会做。
如果老师说:
“这里写一个
for循环。”
他也可能写得出来。
但真正的问题通常不会告诉学生应该使用什么结构。
学生必须自己判断:
哪些是输入数据?
最终需要得到什么?
哪些中间结果必须保存?
有没有不同情况?
某个操作是否需要重复?
步骤之间有什么依赖关系?
这时考查的已经不只是 Python 语法。
而是算法思维。
真正的理解,会在题目发生变化时表现出来
如果练习和课堂上的例题几乎一样,学生可以模仿原来的代码。
但如果我们改变条件呢?
例如:
- 三个数变成三十个数;
- 折扣率根据价格变化;
- 某些数据必须被排除;
- 输入值可能不符合要求;
- 一个计算结果决定下一步执行什么;
- 同一程序必须处理不同的数据。
这时,单纯记住代码结构就不够了。
学生必须理解:
为什么程序是这样组织的。
这也是“会做一道题”和“掌握一种方法”的区别。
AI 可以生成代码,但不能替代这个认知过程
现在,得到一段正确代码非常容易。
学生可以搜索类似例题。
可以复制现成程序。
也可以让 AI 生成完整解决方案。
这些工具本身并不是问题。
关键在于:
学生是否理解得到的代码为什么这样工作?
可以进一步问:
- 为什么需要这个变量?
- 如果数据改变,哪一部分代码也要改变?
- 为什么这里使用条件?
- 为什么这个操作必须先执行?
- 能不能不用看代码,先解释整个解决过程?
如果这些问题无法回答,那么程序即使能够运行,也不能证明学生已经掌握了背后的知识。
GeoGebra、Excel 和 Python 展示的是不同的思维结构
同一个数学问题可以放进不同工具中。
但工具并不是完全中性的。
GeoGebra特别适合展示函数、几何对象以及数学关系的视觉变化。
Excel非常适合处理表格、数据序列、公式和重复计算。
Python则会把过程结构暴露得更加明显:
先做什么?
后做什么?
什么条件下执行?
什么操作重复?
哪些结果需要继续使用?
因此,一个学生会使用 GeoGebra,并不意味着他自然就会用 Python 表达同一个问题。
会使用 Excel 公式,也不意味着他已经掌握算法思维。
这不是简单的“会不会使用软件”。
而是学生能否在不同的知识表示方式之间进行转换。
如果数学本身还是用外语学习的呢?
在国际教育环境中,问题还可能多一层。
学生可能用英语、德语或其他语言学习数学,然后再使用 Python 完成任务。
此时真正的路径可能是:
题目语言 → 理解题意 → 数学模型 → 运算过程 → 算法 → Python
所以,最后出现在代码里的错误,可能实际上从语言理解阶段就已经开始了。
例如,学生可能:
- 没有准确理解某个数学术语;
- 忽略了题目中的限制条件;
- 误解了两个量之间的关系;
- 正确完成了计算,却回答了另一个问题。
在这种情况下,把“语言”“数学”和“编程”完全分开教学,并不一定能够找到真正的困难。
有时,语言本身就是学科思维的一部分。
与其马上改代码,不如先让学生把思路说出来
如果老师直接写出正确程序,当前这道题很快就能完成。
但如果目标是让学生以后能够独立解决问题,那么更有价值的是先问:
- 已知什么?
- 要求什么?
- 第一步是什么?
- 为什么先做这一步?
- 会产生什么中间结果?
- 下一步依赖哪个结果?
- 有没有条件判断?
- 有没有需要重复执行的操作?
- 最后怎样检查结果是否合理?
还有一个非常重要的问题:
如果暂时不用 Python,你能不能把解决过程一步一步解释清楚?
如果不能,那么困难可能还没有到代码这一层。
先找到问题发生在哪一层
在 Levitin Language School,学生无法把数学题写成 Python 程序,并不会自动被理解为“Python 学得不够”。
首先需要判断问题发生在哪里。
可能是:
- 数学概念;
- 题意理解;
- 逻辑关系;
- 把问题拆成步骤的能力;
- 算法思维;
- Python 本身;
- 学习该学科所使用的语言。
只有找到真正断裂的位置,教学才能针对原因,而不是只修改最后出现的错误。
在 Language Learnings 的国际学习环境中,这一点尤其重要:语言可能不仅是学习对象,也可能是学习数学、编程和其他学科的工具。
而在 Tymur Levitin 的教学方法中,关键问题不仅是:
“答案对不对?”
还包括:
“这个答案是通过什么思维机制产生的?”
因此,三个层面相互加强:
Tymur Levitin —— 对学习机制、知识转换和错误来源进行分析与诊断;
Levitin Language School —— 根据学生的实际需要连接语言、数学、编程及其他学科;
Language Learnings —— 在国际学习环境中连接语言能力与知识的实际使用。
数学 + 编程 + 语言
有些学生真正需要的是数学。
有些需要的是 Python。
有些两者分别都会,却不知道怎样把数学思维转换成算法。
还有一些国际学校的学生,需要同时解决另一个问题:
如何用学习语言理解并处理学科知识。
所以,真实的学习需求未必能被简单归入一个标签。
它可能正好位于几个领域的交叉点:
数学 + 逻辑 + 编程
或者:
语言 + 学科 + 编程
找到这个交叉点,往往比单纯增加练习数量更重要。
了解更多
如果学生能够在纸上正确解决数学问题,却无法独立把它写成 Python 程序,首先值得判断的是:困难究竟来自数学、逻辑、算法、Python,还是学习语言。
在 Levitin Language School,学习可以根据学生实际需要组合语言、数学、编程以及其他学科,而不是先把学生的问题强行归入某一个固定课程标签。
Language + Subject 的学习路径也适用于那些使用外语学习数学、计算机科学或其他学科的学生:语言在这里不仅是学习目标,也是获取和运用知识的工具。
Levitin Language School
https://levitintymur.com/
Language Learnings
https://languagelearnings.com/
Tymur Levitin
创始人兼校长
Levitin Language School / Language Learnings
全球学习。个性化方法。
© Tymur Levitin。保留所有权利。
