1、教科版2019信息技术必修1数据与计算第2单元编程计算2.4可以复用的代码教学设计 【教材分析】代码复用通常分为两种情况,一种是在当前程序内容,对部分语句块进行复用;另一种是在开发一个新的程序时,复用已经设计好的软件模块。代码复用有很多优点如提升编程效率、提高可维护性、增强可读性等。Python中常见的代码复用方式有函数、类和代码发布等。考虑到必修部分对学生的要求,本节只涉及函数和代码发布。函数分为系统函数和用户自定义函数两种类型。在本节之前学生已经使用过print()和input()函数,由于个性化的需求,教材从系统函数过渡到自定义函数。定义函数时的函数名、参数、返回值和函数体;调用函数时的
2、参数传递过程都是本部分的重点内容。自定义模块分为代码发布和导入模块两部分内容。根据学情,也可以用创建模块替代代码发布。在技术实现的同时,教材还要引导学生提升代码共享的意识。发布代码的DOS界面过程没有纳入教材,教师可以在下面的案例中寻找相关内容。【教学建议】本节我们将围绕“解决火柴棒摆数字问题”项目展开学习。项目主要包含“用自定义函数实现火柴棒摆数字问题”和“发布共享代码实现火柴棒摆数字问题”两个任务。任务一通过函数实现程序内的代码复用;任务二则侧重于在新程序中调用外部共享模块。该节是第2单元难度最大的一节,因此教师在本节教学中可以适当放缓教学进度,给学生尽可能多的指导。任务一的“用自定义函数
3、实现火柴棒摆数字问题”首先通过一个比较复杂的问题引入。学生初次接触该任务往往不知所措,因此教师可以借助于流程图将一个火柴棒摆数字的问题拆解为“穷举需要6根火柴棒的自然数”和“计算一个数需要多少根火柴棒”两个问题。通过拆解让学生感受到程序需要对部分代码进行反复使用,从而引出代码复用的必要性。当然该问题也可以用循环嵌套来解决,教师可以在函数讲解之后比较两种解决方式,让学生自己体会,从而在今后的编程问题时能够做出恰当的选择。在程序编写方面学生会遇到很多问题:计算一个数需要多少根火柴棒的算法;函数的定义格式;函数的调用等。其中是算法问题,难度较大,可以采用小组讨论的方式,激发学生的思想火花。要重点讲解
4、函数的参数传递过程。对于形参、实参等较难的概念,教师无需让学生深入挖掘。任务二“发布共享代码实现火柴棒摆数字问题”分为两部分内容:发布代码和导入使用模块。两者难度均不大,主要是培养学生共享代码的意识,这也是软件工程思想的一部分。教学时可以两人一组,体会发布和导入的一般过程。此处较常见的错误是因为学生对DOS命令不熟悉,尤其是对路径的概念缺失,造成命令出错,因此教师在演示的时候要重点说明。类也是代码复用的常见方式,如果学生基础较好,教师也可适当补充关于类的简单使用,让学生感受面向对象程序的特点。【学习目标】1.了解函数的作用。2.学会函数的定义和调用方法,并能熟练使用函数解决问题。3.学会发布共
5、享代码的常见方法,并能熟练使用模块解决问题。【教学重点、难点】函数的作用。函数的定义和调用方法,并能熟练使用函数解决问题。发布共享代码的常见方法,并能熟练使用模块解决问题。【教学过程】第一课时引入我们编写的程序代码中有许多功能是相似甚至完全相同的,这时可以考虑用代码复用的方法提高程序的效率。使用“函数”和“模块”是代码复用的常见方法。Python包含了丰富的内置函数和模块,你也可以自己编写一些函数或模块,还可以到代码共享社区去下载。善于利用这些方法既可以减少重复编写代码的工作量,也可以使程序的结构更加清晰。当我们面对一些复杂问题时,可以采取“自顶向下、逐步细化”的方法,即将一个完整的问题分成若
6、千个小问题,每个小问题实现一个功能,再将每个小问题逐步细化、分解为一系列具体可实现的步骤。本节我们将围绕“解决火柴棒摆数字问题”项目展开学习,通过该项目活动,体验复用和共享代码为编程带来的便利。本项目主要包含“用自定义函数实现火柴棒摆数字问题”和“发布共享代码实现火柴棒摆数字问题”两个任务。任务一用自定义函数实现火柴棒摆数字问题活动1用流程图表述问题解决的思路有6根火柴棒,列出所有能摆出的自然数,要求火柴棒正好用完。火柴数字如图2.4.1所示。要找出这些数,可以从0到111依次判断这些数是不是恰巧需要6根火柴棒。为什么是0到111呢?观察图2.4.1 可知,在0-9这十个数字中,摆出“1”只需
7、要2根火柴棒,是需要火柴棒数最少的数字。因此6根火柴棒能摆放的最大数就是111。将自己的想法用流程图表示出来,如图2.4.2所示。如何计算一个数需要多少根火柴棒呢?可以将这个数的每个数位上的数字所需要的火柴棒数加起来。实现方法是将这个数除以10取余,求得个位数;然后将这个个位数需要的火柴棒数累加;接着将这个数除以10取整,去掉个位数;重复以上步骤直到这个数为0。这种方法可行吗?请将其转化为流程图填入图2.4.3的框中。活动2,完善程序实现问题解决如果遇到一个需求多次出现,可以先思考,有没有内置函数可以提供帮助。如果没有,则可以考虑寻找或自己编写一个自定义函数。“一个数字需要多少根火柴棒”的问题
8、可以通过函数计算来实现。那么,如何编写函数呢?函数函数可分为系统兩数和用户自定义函数两种类型。系统函数即函函数有以下几种:数库中的标准函数,是程序设计语言或操作系统提供给用户的一系列数学运算类函数;已经编制好的程序。在前面单元使用过的print()和input()函数都是系数据转换类函数;统函数。前者用于将字符串按指定格式输出到屏幕上;后者用于接收键盘的输人,并存储于相应变量中。用户自定义函数则是用户自己编写的一段程序。 函数一般包括函数名、参数、返回值和函数体等四部分。其中,函数名和函数体是必不可少的,参数和返回值可根据需要进行定义。定义函数的基本格式如下。def雨数名(参数): #函数说明
9、语句或语句组return返回值 参数是用来向函数传递值的,当有多个参数时,各个参数之间用逗号分隔开。函数执行完成后,由return语句将表达式值返回给调用者,结束丽数。函数的调用采用函数名(参数)的方式。下面先来看一个简单的例子,这个函数用来求n!。deffactorial(n):#求n!5-1foriinrange(2,n+1):s=s*ireturns#调用factorial函数total-factorial(4)print(total) 上例中,程序执行时由于def块中的代码不是主程序的一一部分,因此会跳过该段代码,从主程序的第-行total=factorial(4)开始运行。在遇到函数
10、的调用语句factorial(4)时,转到函数中的第-行代码开始执行。函数运行时,变量n会被赋值为4。丽数执行完成返回变量s的值即24,然后回到语句total=factorial(4),将返回值赋给变量total,最后输出。请完善下列程序,列出所有能摆出的自然数。defmatch._num(num):#该自定义函数实现计算-一个数字需要多少根火柴棒#以下为主程序snum=6#6根火柴棒print(你可以拼出这些数字:)foriinrange(112):ifmatchnum(1)=snum:#如果需要的火柴棒数等于现有火柴棒数print(i)第二课时任务二发布共享代码实现火柴棒摆数字问题活动1发
11、布共享代码 任何人编写的代码都有可能帮到其他人,那么如何共享这些有价值的成果呢?常见的方法是发布代码。请将“计算一个数字需要多少根火柴棒”的函数match_num转换为模块,然后发布。发布代码通过模块发布代码可以让很多人受益于你的工作。下面就以任务一为例介绍发布代码的方法。 首先做好发布前的准备工作。在D:创建-一个文件夹mymodule,其中包含mymodule.py和setup.py两个文件。mymodule.py是一个模块文件,其内容就是match_num函数。defmatchnum(num):f=6,2,5,5,4,5,6,3,7,6#09分别需要多少根火柴棒ifnum=0: #将火柴
12、棒总数变量赋初值total=f0else:total=0while(num0):x-num%10 #取num除以10的余数,即num的个位数total=total+fx #所需火柴棒数累加num=num/10 #num整除10,即去掉num的个位数returntotal #返回需要多少根火柴棒数setup.py文件包含有关发布的元数据,代码如下。fromdistutils.coreimportsetupsetup(name=mymodule, #参数一定要与mymodule.py文件名相同version=1.0.0, #版本号#参数-定要与mymodule.py文件名相同py_modules=
13、mymodule,author=yd, #作者authoremail=yd,#作者邮箱#代码功能描述description=计算一个数字需要多少根火荣棒, 然后打开mymodule所在的目录,构建发布文件。最后将发布文件安装到你的Python本地副本中。安装完成后,mymodule文件夹包含了如图2.4.4所示的文件。如果你想让全世界都分享你的成果,你可以在互联网上发布你的代码。活动2导入并使用模块 在本机发布模块mymodule后,现在需要使用该模块来完成火柴棒摆数字的问题,应该如何调用呢?导入模块并使用 已经构建发布的模块必须先导人程序才能使用。导人时使用语句“importmymodule
14、,调用模块内的函数时用“mymodule.match_num()”来实现。 完善下列程序,导入安装发布好的模块mymodule,实现火柴棒摆数字问题。import_ #导人模块snum=6print(你可以拼出这些数字:)foriinrange(112):if_ =snum: #调用模块内的match_num()函数print(1)拓展练习 请编写程序,实现输人一个人的出生年份(1900),输出他的生肖,直到输人0结束,运行结果如图2.4.5所示。请输人出生年份,输入结束:2004你的生肖是:猴请输入出生年份,输入结束:完善下列代码,实现上述功能。defshengxiao(year):#求生肖
15、zodiac=鼠,牛,虎,兔,“龙,蛇,马”,羊”,猴,鸡,狗,猪#以下为主程序myyear=int(input(请输人出生年份,输入0结束:)whilemyyear!=0:print(“你的生肖是:,myyear=int(input(请输入出生年份,输入0结束:)拓展知识 Python中提供了大量标准模块,亦称标准库,例如在“最强大脑”游戏的程序中使用的time模块和random模块。利用time模块可以获取计算机的时钟信息,包括日期和时间。也可以利用它进行延时,参见下面的程序。importtimeprint(time.time() #时间戳,即1970纪元后经过的浮点秒数time.slee
16、p(2) #延时2秒print(time.asctime() #格式化显示时间利用random模块可以生成随机数,参见下面的程序。importrandomnum=random.randint(0,1) #产生-一个0,1之间的随机整数print(num)四、小结函数的作用;函数的定义和调用;共享代码的发布。【拓展练习】求多边形面积活动:计算三角形面积活动描述:已知各边长,计算下列多边形的面积。分析:用海伦公式求三角形的面积:a,b,c为三角形的边长,p为半周长,即p=(a+b+c)/2上述多边形可分割为3个三角形,只要分别计算其面积,然后将面积求和即可。求解过程:3个三角形的面积计算,除了具体
17、数值不一样,计算方法完全相同。能否找到方法优化程序代码?(1)定义函数计算三角形面积def s(a,b,c): p=(a+b+c)/2 mj=math.sqrt(p*(p-a)*(p-b)*(p-c) return mj(2)函数的调用如:s1=s(b1,b5,b6)s函数运行时,变量a、b、c会自动填入调用时传递过来的b1,b5,b6的值。函数运行结束后,计算结果mj通过return传递给变量s1,完成三角形的计算。(3)完整程序import mathdef s(a,b,c): p=(a+b+c)/2 mj=math.sqrt(p*(p-a)*(p-b)*(p-c) return mjb1,
18、b2,b3,b4,b5,b6,b7=3,2,3,4,3,4,5print(s(b1,b5,b6)+s(b2,b6,b7)+s(b3,b4,b7)运行结果:14.271806993392246上台阶活动:N级楼梯上楼问题活动描述:一次可以走两级或一级楼梯,问N级楼梯有多少种上楼方式?参考代码:def f(n): if n = 1 or n = 2: return n elif n=3: return f(n-1) + f(n-2) else: return -1n=int(input(请输入台阶数:)print(f(n)练习题:1. 求1!+2!+3!+10!的结果,要求用函数实现阶乘的计算。def factorial(n): #求n! s=1 for i in range(2,n+1): s=s*i return s#调用factorial函数total=0for i in range(1,11): total=total+factorial(i)print(total)【教学反思】