,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,8,章 函数与模块,*,第,8,章 函数与模块,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第,8,章 函数与模块,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Python,语言程序设计,第,8,章 函数与模块,Python语言程序设计第8章 函数与模块,程序结构清晰,可读性好。,减少重复编码的工作量。,可多人共同编制一个大程序,缩短程序设计周期,提高程序设计和调试的效率。,使用函数的,好处,8.1,概述,函数是一组实现某一特定功能的语句集合,是可以重复调用、功能相对独立完整的程序段,。,程序结构清晰,可读性好。使用函数的8.1 概述,使用,库函数,应注意:,1,、函数功能,2,、函数参数的数目和顺序,及各参数意义和类型,3,、函数返回值意义和类型,用户自定义函数,1.,从用户的使用角度,库函数(标准函数):由系统提供,在程序前导入该函数原型所在的模块,函数分类,使用库函数应注意:用户自定义函数1.从用户的使用角度函数分,2.,从参数传递的角度,函数分类,def average(x,y,z):,aver=(x+y+z)/3;,return(aver),a,b,c=eval(input(please input a,、,b,、,c:),ave=average(a,b,c),print(average=%f%ave),def printstar():,print(*),def print_message():,print(How are you!),def main():,printstar(),print_message(),printstar(),main(),有参函数,无参函数,2.从参数传递的角度函数分类def average(x,y,8.2,函数的定义与调用,定义一般形式:,def,函数名(,形式参数表,),:,函数体,return,表达式,采用,def,关键字定义函数,不需要指定返回值的类型;,函数的参数不限,不需要指定参数类型;,参数括号后面的冒号“,:”,必不可少;,函数体相对于,def,关键字必须保持一定的空格缩进;,return,语句是可选的;,允许,定义函数体为空的函数,。,函数定义时要注意,8.2 函数的定义与调用def 函数名(形式参数表):采,一般形式:,函数名(,实际参数表,),函数的调用,说明,实参,可以是常量、变量、表达式、函数等,但在,进行函数调用时必须,有确定的值,。,函数的实参和形参应在,个数、类型和顺序,上 一 一对应。,对于无参函数,调用时实参表列为空,但,(),不能省。,一般形式:函数的调用说明,例:编写函数,求,3,个数中的最大值。,def getMax(a,b,c):,if ab:,max=a,else:,max=b,if(cm):,max=c,return max,a,b,c=eval(input(input a,b,c:),n=getMax(a,b,c),print(max=,n),在,Python,中不允许前向引用,即在函数定义之前,不允许调用该函数。,例:编写函数,求3个数中的最大值。def getMax(a,8.3,函数的参数和函数的返回值,形式参数:定义函数时函数名后面括号中的变量名,实际参数:调用函数时函数名后面括号中对应,的参数,说明,实参可以是常量、变量和表达式,但必须在函数,调用之间有确定的值。,形参与实参,个数相同,形参,定义时,编译系统并,不,为其,分配,存储,空间,,也,无初值;,只有在函数,调用时,,,临时分配存储空间,,接受来自实参的值;函数,调用结束,,,内存空间释放。,def average(x,y,z):,aver=(x+y+z)/3;,return(aver),a,b,c=eval(input(please input a,、,b,、,c:),ave=average(a,b,c),print(average=%f%ave),8.3 函数的参数和函数的返回值说明def average(,参数传递方式,单向的值传递,实参和形参之间是,单向的值传递。,在函数调用时,将各实参表达式的值计算出来,赋给形参变量。因此,,实参与形参必须类型相同或赋值兼容,个数相等,一一对应,。在函数调用中,即使实参为变量,形参值的改变也不会改变实参变量的值。,实参和形参占用不同的内存单元,传地址方式,函数调用时,将实参数据的存储地址作为参数传递给形参,参数传递方式实参和形参占用不同的内存单元传地址方式,def swap(a,b):,a,b=b,a,print(a=,a,b=,b),x,y=eval(input(input x,y:),swap(x,y),print(x=,x,y=,y),运行结果:,input x,y:3,5,a=5 b=3,x=3 y=5,形式参数(形参),实际参数(实参),例如:编一程序,将主函数中的两个变量的值传递给,swap,函数中的两个形参,交换两个形参的值。,单向值传递,def swap(a,b):运行结果:形式参数(形参)实际,def swap(,a_list,):,a_list0,a_list1=a_list1,a_list0,print(a_list0=,a_list0,a_list1=,a_list1),x_list=3,5,swap(,x_list,),print(x_list0=,x_list0,x_list1=,x_list1),运行结果:,a_list0=5 a_list1=3,x_list0=5 x_list1=3,例:传地址方式。,def swap(a_list):运行结果:例:传地址方式,函数的返回值,指函数被调用、执行完后,返回给主调函数的值。,函数的返回语句,一般形式,return,表达式,功能:,使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数,def add(a,b):,c=a+b,x=add(3,20),print(x),说明,函数内可有,多条返回语句,。,如果没有,return,语句,会自动返回,NONE,;如果有,return,语句,但是,return,后面没有表达式也返回,NONE,。,函数的返回值def add(a,b):说明,例:编写函数,判断一个数是否是素数。,def isprime(n):,for i in range(2,n):,if(n%i=0):,return 0,return 1,m=int(input(,请输入一个整数,:),flag=isprime(m),if(flag=1):,print(%d,是素数,%m),else:,print(%d,不是素数,%m),例:编写函数,判断一个数是否是素数。def isprime(,例:,求一个数列中的最大值和最小值。,def getMaxMin(x):,max=x0,min=x0,for i in range(0,len(x):,if maxxi:,min=xi,return(max,min),a_list=-1,28,-15,5,10#,测试数据为列表类型,x,y=getMaxMin(a_list),print(a_list=,a_list),print(,最大元素,=,x,最小元素,=,y),string=Hello,x,y=getMaxMin(string),print(string=,string),print(,最大元素,=,x,最小元素,=,y),例:求一个数列中的最大值和最小值。def getMaxMin,8.4,函数的递归调用,在函数的执行过程中又直接或间接调用该函数本身,直接递归调用,在函数中直接调用函数本身,间接递归调用,在函数中调用其它函数,其它函数又调用原函数,f(),调,f,调,f2,调,f1,f1(),f2(),def a(x):,z=b(y),.,return(2*z),def b(t):,m=a(x),.,return(3+c),def f(x):,z=f(y),.,return(2*z),8.4 函数的递归调用f()调f调f2调f1f1()f2,递归算法的两个基本特征,递推归纳,将问题转化为比原问题小的同类规模,归纳出一般递推公式,.,故所处理的,对象要有规律地递增或递减,递归终止,当规模小到一定的程度应该结束递归调用,逐层返回,常用条件语句来控制何时结束递归,递归算法的两个基本特征,17 十一月 2024,例 求递归方法求,n,的阶乘,递推归纳:,递归终止:,def fac(n):,if n=0:,f=1,else:,f=fac(n-1)*n;,return f,n=int(input(please input n:),f=fac(n),print(%d!=%d%(n,f),26 九月 2023例 求递归方法求n的阶乘递推归纳:递归终,总结,执行过程(两个阶段),第一阶段:逐层调用,调用函数自身,第二阶段:逐层返回,返回到调用该层的位置,递归调用是多重嵌套调用的一种特殊情况,调用的深度:,调用的层数,总结,例:有,5,个人,第,5,个人说他的年龄比第第,4,个人大,2,岁,第,4,个人说他的年龄比第,3,个人大,2,岁,第,3,个人说他的年龄比第,2,个人大,2,岁,第,2,个人说他的年龄比第,1,个人大,2,岁;第一个人说他是,10,岁。请问第,5,个人多大?,17 十一月 2024,思路:建立函数求个人的年龄,以每人的序号为参数,根据题意可知:,age(5)=age(4)+2 age(4)=age(3)+2,age(3)=age(2)+2 age(2)=age(1)+2,age(1)=10;,即,age(n)=,(n=1),age(n-1)+2 (n1),例:有5个人,第5个人说他的年龄比第第4个人大2岁,第4个人,def age(int n):,if n=1:,c=10,else:,c=age(n-1)+2,return c,n=int(input(“input n:”),print(“%d”%age(,n,),age(5),=age(4)+2,age(4),=age(3)+2,age(3),=age(2)+2,age(2),=age(1)+2,age(1),=10,age(5),=18,age(4),=16,age(3),=14,age(2),=12,递归结束条件,def age(int n):age(5)age(4)ag,设计递归算法的方法,前提:,原问题可以层层分解为类似的子问题,且子问题比原问题规模更小,规模最小的问题具有直接解,方法:,寻找分解方法:将原问题转化为子问题求解,例:,n!=n*(n-1)!,设计递归出口:根据规模最小的子问题确定递归终止条件,例:求解,n!,,当,n,0,时,,n!,1,;,设计递归算法的方法前提:原问题可以层层分解为类似的子问题,且,前提:,原问题可以层层分解为类似的子问题,且子问题比原问题规模更小,规模最小的问题具有直接解,方法:,寻找分解方法:将原问题转化为子问题求解,例:,n!=n*(n-1)!,设计递归出口:根据规模最小的子问题确定递归终止条件,例:求解,n!,,当,n,0,时,,n!,1,;,设计递归算法的方法,前提:原问题可以层层分解为类似的子问题,且子问题比原问题规模,17 十一月 2024,例:,汉诺塔问题,。设有三座塔座(,A,、,B,、,C,),在一个塔座(设为,A,)上有,64,个盘片,盘片不等,按大盘在下,小盘在上的顺序依次叠放。现要将,A,塔上的盘片借助于,B,塔,移到,C,塔上并保持同样顺序叠排,移动盘片时必须遵守以下规则:,(,1,)每次只能移动一个圆盘;,(,2,)圆盘可以插在,A,、,B,、,C,任意一个塔座上;,(,3,)任何时候都不能将一个较大的圆盘放到,较小的圆盘之上。,26 九月 2023例:汉诺塔问题。设有三