1、2.4可以复用的代码 导入新知 我们编写的程序代码中有许多功能是相似甚 至完全相同的,这时可以考虑用代码复用的 方法提高程序的效率。使用“函数”和“模 块”是代码复用的常见方法。Python 包含了 丰富的内置函数和模块,你也可以自已编写- -些函数或模块,还可以到代码共享社区去下 载。善于利用这些方法既可以减少重复编写 代码的工作量,也可以使程序的结构更加清 晰。 学习目标 了解函数的作用。 学会函数的定义和调用方法,并能熟练的使 用函数解决问题。 学会发布共享代码的常见方法,并能熟练使 用模块解决问题。 探索新知 O 当我们面对一些复杂问题时,可以采取 “自顶向下、逐步细化的方法,即将一个
2、完整 的问题分成若千个小问题,每个小问题实现一 个功能,再将每个小问题逐步细化、分解为一 系列具体可实现的步骤。 O 本节我们将围绕“解决火柴棒摆数字问题” 项目展开学习,通过该项目活动,体验复用和 共享代码为编程带来的便利。 O 本项目主要包含“用自定义函数实现火柴 棒摆数字问题”和“发布共享代码实现火柴棒 摆数字问题”两个任务 任务一 用自定义函数实现火柴棒摆数字问题 O活动1用流程图表述问题解决的思路 有6根火柴棒,列出所有能摆出的自然数, 要求火柴棒正好用完。火柴数字如图2.4.1 所示。 思路分析 要找出这些数,可以从 0到111依次判断这些数是不 是恰巧需要6根火柴棒。 为什么是0
3、到111呢? 观察图2.4.1可知,在 09这十个数字中,摆出“1” 只需要2根火柴棒,是需要 火柴棒数最少的数字。 因此6根火柴棒能摆放 的最大数就是111。 将自己的想法用流程图 表示出来,如图2.4.2所示。 解析 如何计算一个数需要 多少根火柴棒呢?可以将这 个数的每个数位上的数字 所需要的火柴棒数加起来。 实现方法是将这个数 除以10取余,求得个位数; 然后将这个个位数需要的 火柴棒数累加;接着将这个 数除以10取整,去掉个位 数; 重复以上步骤直到这 个数为0。这种方法可行吗? 请将其转化为流程图填入 图2.4.3的框中。 活动2完善程序实现问题解决 O如果遇到一个需求多次出现,可
4、以先思考, 有没有内置函数可以提供帮助。 O如果没有,则可以考虑寻找或自己编写一 个自定义函数。 O“一个数字需要多少根火柴棒”的问题可 以通过函数计算来实现。那么,如何编写 函数呢? 函数 函数可分为系统函数和用户自定义函数两种类型。系 统函数即函数库中的标准函数,是程序设计语言或操作系 统提供给用户的一系列已经编制好的程序。在前面单元使 用过的print()和input()函数都是系统函数。前者用于将 字符串按指定格式输出到屏幕上;后者用于接收键盘的输人, 并存储于相应变量中。用户自定义函数则是用户自己编写 的一-段程序。 函数一- 般包括函数名、参数、返回值和函数体等四 部分。其中,函数
5、名和函数体是必不可少的,参数和返回 值可根据需要进行定义。.定义函数的基本格式如下。 函数的分类 自定义函数求 n! Odef factorial(n): O #求n! O s=1 O for i in range(2,n+1): O s=s*i O return s O#调用factorial函数 Ototal=factorial(4) Oprint(total) O Oinput(运行完毕,请按回车键退出.) 总结 上例中,程序执行时由于def块中的代码 不是主程序的一部分,因此会跳过该段代码, 从主程序的第- -行total = factorial(4)开 始运行。在遇到函数的调用语句f
6、actorial(4) 时,转到函数中的第一行代码开始执行。 函数运行时,变量n会被赋值为4。函数 执行完成返回变量s的值即24,然后回到语句 total = factorial(4), 将返回值赋给变量 total,最后输出。 活动2 完善程序 Odef match_num(num): O f=6,2,5,5,4,5,6,3,7,6 # 0-9的数字分别需要多少根小棒 O if num=0: # 火柴棒总数变量赋初值 O total=f0 O else: O total=0 O while (num0): O x=num % 10 # 取num除以10的余数,即num的个位数 O total
7、=total+fx # 所需火柴棒数累加 O num=num/10 #num整除10,即去掉num的个位数 O return total #返回需要多少根火柴棒数 O#以下为主程序 Osnum=6 # 6根火柴棒 Oprint(你可以拼出这些数字:) Ofor i in range(112): O if match_num(i)=snum: #如果i需要的火柴棒数等于现有火柴棒数 O print (i) Oinput(运行完毕,请按回车键退出.) 发布代码 任务二发布共享代码实现火柴棒摆数字问题 活动1发布共享代码 任何人编写的代码都有可能帮到其他人,那么如何共享 这些有价值的成果呢?常见的方
8、法是发布代码。请将“计算 一个数字需要多少根火柴棒”的函数match_ num转换为模块, 然后发布。 发布代码 通过模块发布代码可以让很多人受益于你的工作。下面 就以任务一为例介绍发布代码的方法。 首先做好发布前的准备工作。在D:创建.-个文件夹 mymodule,其中包含mymodule.py和setup.py两个文件。 mymodul.py是- -个模块文件,其内容就是match _num 函数。 模块文件 Odef match_num(num): O f=6,2,5,5,4,5,6,3,7,6# 0-9的数字分别需要 多少根小棒 O if num=0: # 火柴棒总数变量赋初值 O t
9、otal=f0 O else: O total=0 O while (num0): O x=num % 10 # 取num除以10的余数,即num的个位数 O total=total+fx # 所需火柴棒数累加 O num=num/10 #num整除10,即去掉num的个位数 O return total#返回需要多少根火柴棒数 Setup.py包含元数据 Ofrom distutils.core import setup Osetup( O name =mymodule, O #参数一定要与mymodule.py文件名相同 O version =1.0.0, #版本号 O py_module
10、s =mymodule, O #参数一定要与mymodule.py文件名相同 O author=yd, #作者 O author_email=, #作者邮箱 O #代码功能描述 O description =计算一个数字需要多少根火柴棒, O ) 导入并使用模块 Oimport mymodule #导入模块 Osnum=6 # 6根火柴棒 Oprint(你可以拼出这些数字:) Ofor i in range(112): O if mymodule.match_num(i)=snum: #调用模块内match_num()函数 O print (i) Oinput(运行完毕,请按回车键退出.) 拓
11、展练习 def shengxiao(year): #求生肖 zodiac=鼠,牛,虎,兔,龙,蛇,马,羊 ,猴,鸡,狗,猪 index=(year-1972)%12 return zodiacindex #以下为主程序 myyear=int(input(请输入出生年份,输入0结束:) while myyear!=0: print(你的生肖是:,shengxiao(myyear) myyear=int(input(请输入出生年份,输入0结束:) 拓展知识 OPython中提供了大量标准模块,也叫标准库。在最 强大脑的游戏中使用time模块与random模块。 OTime模块案例 Oimport time Oprint(time.time() #时间戳,即1970纪元后经过的浮点秒数 Otime.sleep(2) #延时2秒 Oprint(time.asctime() #格式化显示时间 O Oinput(运行完毕,请按回车键退出.) Ramdom模块 Oimport random Onum=random.randint(0,10000) #产生一个0,10000之间的随机整数 Oprint(num) O Oinput(运行完毕,请按回车键退出.) 本节课到此结束