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