教科版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)
【教学反思】