内容正文:
2.4 可以复用的代码
【学习目标】
1.了解函数的作用。
2.学会函数的定义和调用方法,并能熟练使用函数解决问题。
3.学会发布共享代码的常见方法,并能熟练使用模块解决问题。
【知识框架】
如果代码中有许多功能是 甚至是 的,此时可以考虑用 的方式来提高程序的效率,精简程序的结构。在Python中,“ ”和“ ”是常用的方法。
知识点1:工程设计思想:“自顶向下、逐步细化”
将一个完整的问题分成若干小问题,每个小问题实现一个功能,再将每个小问题再逐步细化、分解为一系列具体可实现的步骤。
项目活动:实现火柴棒摆数字问题,有6根火柴棒,列出所有能摆出的自然数,要求火柴棒正好用完。
活动1:用流程图表述问题解决的思路(右图)
【分析】观察图形,6根火柴棒最大的组成数是111,要找出符合条件的自然数,可以从0到111,依次判断这些数是不是恰巧需要6根火柴棒。
思考如何计算一个数需要多少根火柴棒呢?
根据火柴数字图,从0-9每个数字需要的火柴棒数量是固定的,可以存在列表[4,2,5,5,4,5,6,3,7,6]中,再根据索引值取值。
对于循环尝试的数进行位权展开如:12=10*1+2,故其中的2可以用求余数的方式得到。(左图)
知识点2:函数
函数可以分为 和 两种类型
其中系统函数即程序设计语言提供给用户的一系列已经编制好的程序,如之前的输入input()和输出print()函数,都是系统函数。用户自定义函数就是用户自己编写的函数。
函数一般包括 、 、 、 等四部分。
def 函数名(参数): #函数说明
语句或语句组 #函数体
return 返回值
其中,函数名和函数体是必须的,不可省略。参数是用来向函数传递值的,当有多个参数时各个参数之间用 隔开。函数执行完成后,由return语句将表达式值返回给调用者并结束函数。函数调用采用:函数名(参数)的方式。
实践1:用函数的方法求n!(n!= n*(n-1)*(n-2)*……3*2*1),代码补齐
1 def fac(n): #求n!
2 s=1
3 for i in range( ):
4
5 return s
6 total=fac(4) #调用fac函数
7 print( )
这是一个自定义实现阶乘的过程,程序首先运行的是第6行,在遇到函数fac(4)时,转到程序的第1行进行运行,直至返回24并赋值给total变量,最终输出total中的值。
拓展练习:
请编写程序,实现输入一个人的出生年份,输出他的生肖,直到输入0结束。
请补全代码,并调试运行程序。
def shengxiao(year): #求生肖的自定义函数
zodiac=["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]
index=
return zodiac[index]
myyear=int(input("请输入出生年份,输入0结束:"))
print("你的生肖是:",shengxiao(myyear))
知识点3:代码共享
通过模块来发布代码,达成共享的目的。
在程序所在的文件夹,建立setup.py文件,文件中是有关发布的元数据。通过构建成模块的形式进行功能共享发布。
知识点4:使用模块
①import 模块名
②from 模块名 import 方法名
两者区别的理解:
①使用的时候需要模块名.方法(参数)才能调用需要的功能方法。
②直接方法(参数)即可调用功能方法。
【课后练习】
一、单选题
1.Python中自定义函数需要什么关键字开始( )
A.function B.def C.define D.void
2.递归函数与一般自定义函数相比,最大特点是( )
A.调用自身 B.支持参数
C.函数名不能以数字开头D.函数代码包含选择结构
3.在Python中,自定义函数一般包括函数名、参数、函数体和返回值部分,其中哪两部分是必不可少的( )
A.函数名和函数体 B.参数和返回值
C.函数名和参数 D.函数体和返回值
4.下列关于Python自定义函数的描述错误的是( )
A.函数代码是可以重复使用的
B.每次调用函数需传递相同的参数值作为函数的输入
C.可通过函数名(参数列表)进行调用
D.函数是一段具有特定功能的语句组
5.下列关于自定义函数的描述正确的是( )
A.函数中 return语句只能放在函数定义的最后
B.定义函数需要使用系统保留字def
C.若定义的函数名与系统函数恰好重名,则定义无效
D.函数没有参数时可以省略后面的空括号
6.利用Python编写自定义函数完成阶乘的计算,代码如下所示,程序运行结果是( )
(1)def factoria1(n): # 求n!
(2) s=1
(3) for i in range(2,n+1):
(4) s=s*i
(5) return s
(6)print(factorial(4))
A.1 B.120 C.24 D.6
7.python中调用模块内函数不正确的( )
A.os.system( ) B.random.sample( )
C.mymodule.match_num( ) D.sys.sleep( )
8.不是系统函数的是( )
A.input() B.bin() C.float() D.factorial()
9.由于递归函数不断调用自身,如果没有设置(),递归调用会形成无限循环。
A.递归条件 B.终止条件C.初始条件D.循环条件
10.函数可分为系统函数和( )两种类型。
A.模块函数B.数据库函数C.自定义函数D.模拟函数
11.函数中用return结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回( )
A.None B.0 C.1 D.False
12.( )是重复反馈过程的活动,( )是重复调用函数自身。
A.递推,递归B.递归,递推C.迭代,递归D.递归,迭代
13.在Python中,函数体用“return [表达式]”将表达式的值返回给调用者,如果return后面没有表达式,这时函数返回的是( )
A.None B.1 C.-1 D.False
二、填空题
1.程序填空,自定义函数的定义和使用:
2.用 Python 编辑器打开“426”下的文件“车道测速提醒.py”,进行以下操作并保存结果。
(1)通常情况下,高速公路客车专用道/快车道,限制的车辆速度在 90-120 公里/小时之间。
(2)编写自定义函数,实现车道测速提醒功能。
注:程序修改时,下划线及序号删除;不删除注释语句。
① cs(b):
if b>120:
print("已超速,请减速!")
②:
print("车速太低,易追尾,请提速!")
③:
print("车速正常,请谨慎驾驶!")
v=④(input("请输入车速:"))
cs(⑤)
3.判断闰年.pv”,进行以下操作并保存结果。
(1)闰年的判断条件是可以被 400 整除,或者可以被 4 整除并且不能被 100 整除。
(2)编写自定义函数,请输入一个年份,输出该年份是否是闰年,是则输出“YES”,否则输出“NO”。
注:程序修改时,下划线及序号册除;不能删除注释。
def rn(①):
if(num%400==0 or num%4==0 ② num%100!=0):
return "YES"
③:
return "NO"
year=④(input("请输入年份:"))
print(⑤)
4.编程用自定义函数的形式计算15~55、150~550和1500~5500三个区间的所有整数和。
① sum(a,b):#定义函数
s=0
for i in range(a, ②):
s+=i
return ③
print(sum(15,55))
print(sum(④))
print(sum(1500,5500))
5.阅读下列代码,完成以下小题:
(1)下列说法正确的是( )
A.语句6变量a和语句7变量a是同一个变量
B.语句7变量b和语句8右边的变量b是同一个变量
C.语句7变量b和语句8左边的变量b值相等
D.语句6变量a和语句8右边的变量a是同一个变量
(2)print(a,b)输出的结果是( )
A.3,4 B.4,3 C.3 4 D.4 3
(3)下列说法错误的是( )
A.func()的参数和返回值相同 B.func()有两个形参
C.func()有两个返回值 D.func()是自定义函数
(4)关于自定义函数说法正确的是( )
A.自定义函数=参数不能为空
B.自定义函数的返回值不能为空
C.自定义函数一定要写return语句
D.自定义函数一定要写关键字def
6.实现哥德巴赫猜想。
#在下划线①②③处将代码补充完成,并删除序号
def isP(x):
#自定义函数
flag=True
for i in ①(2,int(x**0.5)+1):
if ②==0:
flag=False
break
return flag
n=int(input("属于一个不小于6的偶数:"))
for i in range(3,n//2+1):
if isP(i)and isP(n-i):
print(n,"=",i,"+",③)
7.素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数。回文数是指正读和反读是一样的数字,例如12321,它的正反读都是一样的。
查找[100, 1000]范围内的所有回文素数。
(1)判断121是否为回文素数( )(填:是/否)
(2)自定义函数执行完后,由____语句向调用程序返回值。
(3)for i in range(100, 1001)语句可执行____次循环。
8.数列a中的数据如下,1、2、3、5、8、13、……,请观察数列规律。用自定义函数实现以下功能:从键盘上读入项数n,输出该项对应的数值。
def a(①)
if x==1:
an=1
elif x==2:
an=2
else:
an=a(x-1)+②
return an
n=int(input("请输入项数n: "))
print(a(③))
【学案答案】
1.相似
2.完全相同
3.代码复用
4.函数
5.模块
6.系统函数
7.自定义函数
8.函数名
9.参数
10.返回值
11.函数体
12.,
13.1,n+1
14.s=s*i
15.total
16.(year-1972)%12
【练习答案】
一、单选题
1.答案:B解析:在Python中自定义函数需要def关键字放在函数开始,故本题选B选项。
2.答案:A解析:对自身调用,形成递归,故选A。
3.答案:A解析:自定义函数必须有函数名和函数体。
4.答案:B解析:函数是一段具有特定功能、可重用的语句组,可通过函数名(参数列表)调用。故本题选B
5.答案:B解析:return语句可在实现体中任意位置,一旦执行return,函数就结束了。故A错误。
C选项看两者哪个先用,不一定无效。故C错误。
D选项函数定义的时候括号不可以省略,参数可以没有。故D错误。故正确的是B。
6.答案:C解析:print(factorial(4))可知,传递给自定义函数的参数是4,故返回值s=1*2*3*4=24。故选C。
7.答案:D解析:sleep是时间模块time的函数,即正确的调用是time.sleep(),故本题选D选项。
8.答案:D解析:input()输入函数、bin()十进制转为对应的二进制数的函数、float()是浮点函数,都是常见的系统函数,factorial()不是系统函数,故本题选D选项。
9.答案:B解析:终止条件用于递归的结束。故选B。
10.答案:C解析:系统函数和自定义函数,故选C。
11.答案:A解析:不带表达式的return相当于返回None。
12.答案:C解析:调用函数本身的是递归,排除BD;重复反馈过程的是迭代,不断逼近,故选C。
13.答案:A解析:无任何return,返回None,故选A。
二、填空题
1.答案:return s、jiecheng(abs)
解析:本题主要考查Python中自定义函数。return s用以返回函数执行结果,即阶乘值;程序中调用自定义函数时,采用函数名(参数)的形式,即jiecheng(abs)。
2.答案:def、elif b<90、else、float、v
解析:自定义函数def开头;其他车速小于90,else b<90;剩下的else;车速有可能是浮点型float;参数是v。
3.答案:num、and、else、int、rn(year)
解析:自定义函数中的参数是num;两个判断条件,后者有两个小条件,故是and;其他else;输入的年份是整型int;调用函数名(参数)。
4.答案:def、b+1、s、150,550
解析:自定义函数def;a到b,故填b+1;返回求和结果s;根据上下文填参数150,550,注意逗号是英文状态的。
5.答案:B、D、A、D
解析:本题考查Python程序设计相关内容。分析代码段,(1)A选项,语句6变量a是在自定义函数func中定义,语句7变量a是在主程序中定义,两者不相同。B选项,语句8右边的变量b是实际参数,与语句7变量b是同一个变量。C选项,语句7变量b的值是4,语句8左边的变量b是调用func函数后的返回值3,两者不相同。D选项,语句6变量a是在自定义函数func中定义的形参,语句8右边的变量a是主程序中定义的实参,两者不相同。故本题答案是B选项。
(2)函数作用是当a小于或等于b时,交换a,b的值并返回主程序,故输出的结果是4 3。选D。
(3)A选项,func()的参数和返回值不相同,选项错误。B选项,func()有两个形参:a,b,选项正确。C选项,func()有两个返回值:a,b,选项正确。D选项,func()是自定义函数,选项正确。故本题答案是A选项。
(4)函数代码块以def开头,后接函数名称和圆括号()。参数必须放在圆括号中,若为多个参数时用逗号分隔,函数定义中的参数列表中的参数为形式参数。用return返回计算值,不需要返回值时,return可省略。一个函数中只能用一次return语句(如果条件语句本质上也还是一个返回值),如果希望返回多个值,可以以列表或者元组等数据结构表达的方式返回。对比4个选项,ABC选项错误,D正确。6.答案:range、x%i、n-i
解析:1.数据的范围,用range;2.如果当前的偶数和现在数列中的数能被整除,x%i;3.故另一个数是n-i。
7.答案:否、return、901
解析:(1)121是回文数,但不是素数。故填否。
(2)自定义函数执行后,由return语句向调用程序返回值。
(3)range(start,stop,[step])。计数从start开始,到stop-1结束,步调是step。range(100,1001)语句可执行1000-100+1=901次。
8.答案:x、a(x-2)、n
解析:这个数列是斐波那契数列的变种,前两项分别是1和2,从第三项开始,每一项是前两项之和。
①函数a的参数应该是x,表示项数。故填x。②在递归调用中,an 的值是前两项之和,即 a(x-1)+a(x-2)。故填a(x-2)。③最后在print(a(n)),表示要输出第 n 项的值。
学科网(北京)股份有限公司
$$