内容正文:
化繁为简,赋能思维
——自定义函数的深度复习与实战
太仓市明德高级中学 赵 斌
一、教学理念与学情分析
定位:超越简单的语法回顾,致力于构建以“问题分解”和“代码复用”为核心的计算思维模型。通过“源于课本、高于课本”的典型案例,将分散的知识点串联成线,引导学生从“机械记忆”走向“理解应用”,从“被动答题”走向“主动设计”,从而全面提升应对学考的能力。
学情:学生已完成新课学习,进入学业水平考试备考阶段。学生对自定义函数的基本语法(def、参数、return)已有初步了解,但存在“知其然不知其所以然”、应用场景模糊、难以应对考题变式等问题。
学业水平考试链接:自定义函数是学考的必考点,常见于程序填空、代码补全、程序阅读和结果分析等题型。
二、教学目标
1.(巩固)熟练编写自定义函数的标准格式,深刻理解形参、实参、返回值的作用。
2.(提升)能针对具体问题,准确地进行功能分解,并抽象出自定义函数。
3.(应用)能阅读、调试、完善包含自定义函数的复杂程序,解决学考典型问题。
三、教学过程思路
1.经历“分析问题->分解功能->抽象函数->调用实现”的完整过程,体验模块化程序设计思想。
2.通过“一题多变”和“错例诊断”的实战训练,掌握程序调试与算法优化的基本方法。
体会代码复用带来的效率提升和结构优化,培养良好的编程习惯和工程意识。在解决挑战性任务中获得成就感,增强考前信心。
四、教学重难点
教学重点:自定义函数的设计思想(何时用、如何设计);形参与实参的数据传递机制。
教学难点:从实际问题中准确抽象出函数功能;理解函数的封装性与调试技巧。
五、教学过程设计
【阶段一:情境导入,温故知新】
出示经典“火柴棒摆数字”问题(源于教材的变式):“用6根火柴棒能摆出多少个不同的自然数?”
师生互动:
师问1:“回顾当初,我们是如何解决这个问题的?”(引导学生回忆循环枚举、数字拆解、火柴棒计数等步骤)。
师问2:“在这个程序中,哪一段代码被重复使用了?”(学生指出:计算一个数字所需火柴棒数量的代码段)。
师引:“是的,这段功能独立的代码,正是我们封装成自定义函数的绝佳候选!今天,我们就来深度复习如何用好‘自定义函数’这把利器,让我们的程序更清晰、更强大。”
设计意图: 用经典问题快速激活学生记忆,直指“代码复用”这一函数的核心价值,自然引出复习主题。
【阶段二:概念深化,构建模型】
活动:师生共同构建“自定义函数思维模型图”。
函数的本质:“函数是一个‘功能黑匣子’”。
输入(参数)-> 处理(函数体)-> 输出(返回值)。
用函数的理由?
师生共同总结:①代码复用,减少冗余;②逻辑清晰,易于阅读;③分工协作,便于调试。
【阶段三:案例精讲,举一反三】
核心案例:判断素数的函数。
步骤1(分解):共同分析,判断一个数n是否为素数的功能是独立的、可复用的。
步骤2(抽象):定义函数is_prime(n),输入整数n,返回布尔值True或False。
步骤3(实现与调用):师生共同编写函数代码。
如何利用该函数轻松解决“输出范围内所有素数”或“验证哥德巴赫猜想”等更复杂的问题。
变式训练(学考链接):
题型1(程序填空):提供不完整的程序,让学生补充关键代码(如循环条件、取余)。
(1)素数也叫质数,是除了1和它自身没有其它因数的自然数。
(2)根据数学原理,判断一个数n是否为素数只要判断2到n-1之间是否存在n的因数。请填空完善该程序,实现功能:求1000到2000之间的素数。
def isPrime(n):
# 判断n是否为素数,是返回True,否则返回False
if n <= 1: # 小于等于1的数不是素数
return False
for i in range(2,①): # i的范围2到n-1
if ②: # 如果i是n的因数,则返回False
return False
return True
for x in range(1000,③):
if ④: # 调用函数进行判断x是否为素数
print(x)
题型2(结果分析):给出一个调用is_prime函数的程序,让学生分析输出结果。
阅读下列程序,写出运行结果。
ls=[23,45,67,87]
def is_prime(n):
for i in range(2,n):
if n%i==0:
return False
return True
sum=0
for x in ls:
if is_prime(x):
sum=sum+x
print(sum)
设计意图: 通过一个典型且强大的案例,完整演示函数从设计到应用的全过程。变式训练直接对标学考题型,实现“讲练结合,学以致用”。
【阶段四:实战演练,融会贯通】
任务:“函数魔方”挑战。提供一组基础函数(如is_prime(n), is_palindrome(n)判断回文数)和一段主程序框架。
def is_Prime(n):
# 判断n是否素数,是返回True,否则返回False
if n <= 1: # 小于等于1的数不是素数
return False
for i in range(2,①): #范围2到n-1
if ②: # i是n的因数,则返回False
return False
return True
def is_palindrome(n):
# 判断n是否回文,是返回True,否则返回False
if str(n)==str(n)[::-1]:
return True
else:
return False
if __name__ == '__main__':
# 主程序处
要求: 学生小组合作,通过组合调用这些基础函数,完成一个复杂功能,例如:“找出10-200内所有本身是回文数,且其各位数字之和也是素数的数字”。
师生互动: 教师巡视指导,引导学生像“搭积木”一样思考。
【阶段五:总结提升,展望未来】
关键机制辨析: 通过一个简单的swap(a, b)函数例子,深入讲解形参与实参的关系,以及返回值如何将结果带回主程序。
swap函数示例
# 错误的swap实现 - 展示参数传递概念
def swap_wrong(a, b):
print(f"函数内部交换前: a = {a}, b = {b}")
a, b = b, a # 交换操作
print(f"函数内部交换后: a = {a}, b = {b}")
x=10
y=20
print(f"主程序交换前: x = {x}, y = {y}")
swap_wrong(x, y)
print(f"主程序交换后: x = {x}, y = {y}")
# 正确的swap实现 - 通过返回值
def swap_correct(a, b):
print(f"函数内部交换前: a = {a}, b = {b}")
a, b = b, a # 交换操作
print(f"函数内部交换后: a = {a}, b = {b}")
return a, b # 返回交换后的值
# 主程序
x = 10
y = 20
print(f"主程序交换前: x = {x}, y = {y}")
x,y = swap_correct(x, y)
print(f"主程序交换后: x = {x}, y = {y}")
swap_wrong函数:
o接收两个参数a和b(形参)
o在函数内部交换它们的值
o但没有返回值,调用后实参x和y的值不会改变
swap_correct函数:
o同样接收两个参数a和b(形参)
o在函数内部交换它们的值
o通过return语句返回交换后的值,调用时需要将返回值赋给原变量
关键概念:形参与实参、参数传递机制
形参(a,b):函数定义时声明的参数;实参(x,y):函数调用时传递的实际值
对于不可变对象(如整数),函数内修改形参不会影响实参
对于可变对象(如列表),函数内修改形参会影响实参
def swap_list(list1):
print(f"函数内部交换前: a = {list1[0]}, b = {list1[1]}")
list1[0], list1[1] = list1[1], list1[0] # 交换操作
print(f"函数内部交换后: a = {list1[0]}, b = {list1[1]}")
list0=[10,20]
print(f"主程序交换前: x = {list0[0]}, y = {list0[1]}")
swap_list(list0)
print(f"主程序交换后: x = {list0[0]}, y = {list0[1]}")
设计意图: 将零散的语法知识系统化、模型化,帮助学生从“语法层”理解上升到“设计层”理解,为后续应用打下坚实理论基础。
总 结:
师生共同回顾“自定义判断素数函数的流程图”,再次强调“分解”与“抽象”的思想。
总结函数在学考中的常见考查方式及应对策略。
六、教学反思
本节课通过“问题驱动-模型构建-案例精讲-实战应用”的主线,力求将一节复习课上出深度和新意。对课堂节奏的把控,在“讲”与“练”、“思”与“做”之间找到平衡点,确保学生在活跃的思维活动中扎实地提升能力。
学科网(北京)股份有限公司
$