PYthon语言程序设计课件第5章 函数PPT课件内容

上传人:b****i 文档编号:5527245 上传时间:2023-11-21 格式:PPTX 页数:29 大小:480.90KB
返回 下载 相关 举报
PYthon语言程序设计课件第5章 函数PPT课件内容_第1页
第1页 / 共29页
PYthon语言程序设计课件第5章 函数PPT课件内容_第2页
第2页 / 共29页
PYthon语言程序设计课件第5章 函数PPT课件内容_第3页
第3页 / 共29页
PYthon语言程序设计课件第5章 函数PPT课件内容_第4页
第4页 / 共29页
PYthon语言程序设计课件第5章 函数PPT课件内容_第5页
第5页 / 共29页
点击查看更多>>
文档描述
语言程序设计基础教程第第5 5章章函数函数5.1、函数的定义与调用5.2、参数传递5.3、变量作用域5.4、lambda表达式函数语言程序设计基础教程5.15.1函数的定义与调用函数的定义与调用自定义函数是PYTHON标准函数以外的函数,需要使用者自己定义定义函数的目的:代码重复使用降低开发的难度程序更容易阅读设计函数的原则:找出相对独立功能的代码,即与其它部分关系简单、可单独使用语言程序设计基础教程5.1函数的定义与调用程序代码:1.m=int(input(请输入m的值:)2.n=int(input(请输入n的值:)3.c=factor(m)/(factor(n)*factor(m-n)4.print(C(,)=.format(n,m,c)语言程序设计基础教程5.1函数的定义与调用完整的程序代码:1.def factor(k):2.f=13.for i in range(1,k+1):4.f=f*i5.return f6.m=int(input(请输入m的值:)7.n=int(input(请输入n的值:)8.c=factor(m)/(factor(n)*factor(m-n)9.print(C(,)=.format(n,m,c)分析函数factor:第1行是函数头,包含保留字、函数名、形式参数 第2-5行是函数体,每一行都比函数头行要向右缩进相同大小的空间,第6行无缩进则函数定义结束 函数体的计算结果 使用return语句返还给调用者 定义函数factor的代码需要放在调用该函数的代码之前语言程序设计基础教程5.1函数的定义与调用 调用函数是调用者提供函数定义中每个形参的数值,然后执行函数体,获得函数返回的结果值的过程 调用函数时提供给形参的数值称为,实参的顺序要和形参的顺序一致,没有形参的函数在调用时函数名后的圆括号要保留 函数体中的return语句会结束函数的调用,并返回给调用者return后跟的值作为结果,如果语句没有后跟值,或函数体中没有return语句,则调用结束时返回空对象(None)作为结果语言程序设计基础教程5.1函数的定义与调用程序代码:1.def rootofqe(a,b,c):2.d=b*b-4*a*c3.if d0:4.return(-b+d*0.5)/(2*a),(-b-d*0.5)/(2*a)5.elif d=0:6.return-b/(2*a)7.else:8.return None9.a=int(input(请输入a的值:)10.b=int(input(请输入b的值:)11.c=int(input(请输入c的值:)12.print(rootofqe(a,b,c)分析程序:第1行函数rootofqe的定义中形参有三个,分别为第9-11行的变量在函数体之外,虽然同名但不是形参第12行使用变量的值作为实参调用函数,调用时形参按顺序得到这三个变量的值第2-8行的函数体中使用的是形参,如果函数定义中不定义形参,则函数体可以使用函数体外的变量,但不能修改这三个变量的值第4、6、8行出现了三个,根据变量 的值决定使用哪个返回调用者,函数体内变量 不能函数体外使用语言程序设计基础教程5.1函数的定义与调用没有形参的函数:(函数体中不能修改变量a、b、c)1.def rootofqe:2.d=b*b-4*a*c3.if d0:4.return(-b+d*0.5)/(2*a),(-b-d*0.5)/(2*a)5.elif d=0:6.return-b/(2*a)7.else:8.return None9.a=int(input(请输入a的值:)10.b=int(input(请输入b的值:)11.c=int(input(请输入c的值:)12.print(rootofqe)三次执行程序:()请输入a的值:1请输入b的值:2请输入c的值:1 请输入a的值:1请输入b的值:5请输入c的值:6 请输入a的值:1请输入b的值:2请输入c的值:2语言程序设计基础教程5.1函数的定义与调用函数的复合是将一个函数的调用结果作为调用另一个函数的实参值。例如:print(factor(6)函数的嵌套调用是在一个函数的函数体中调用另一个函数。例如:1.def c():2.return3.def b():4.c()5.return6.def a():7.b()8.return9.a()函数在嵌套调用时,先调用的函数 最后结束,最后调用的函数 最先结束。语言程序设计基础教程5.1函数的定义与调用程序代码:1.def factor(k):2.f=13.for i in range(1,k+1):4.f=f*i5.return f6.def combin(m,n):7.c=factor(m)/(factor(n)*factor(m-n)8.return c9.m=int(input(请输入m的值:)10.n=int(input(请输入n的值:)11.print(C(,)=.format(n,m,combin(m,n)语言程序设计基础教程5.1函数的定义与调用 函数的递归是在定义一个函数时,函数体中嵌套调用自身的一种特殊的嵌套调用。例如:1.def a(i):2.a(i+1)3.a(0)运行结果出错:RecursionError:maximum recursion depth exceeded原因:一直递归调用自身却无法结束调用,造成嵌套调用层数过多而溢出 递归函数在嵌套调用自身时,必须加上一个先决条件 例如:1.def a(i):2.if i=10时不再嵌套调用自身,形参i的值嵌套调用时会不断加1,从而使i=10条件一定会满足3.a(0)#由于提供实参 给形参,会被调用次,前次会嵌套调用自身,不能结束返回,最后 次会返回语言程序设计基础教程5.1函数的定义与调用程序代码:1.def sum(n):2.if n=1:3.return 14.else:5.return sum(n-1)+n6.print(1+2+.+=.format(6,sum(6)语言程序设计基础教程5.1函数的定义与调用 函数的嵌套定义是将一个函数的定义放在另一个函数的函数体中,函数体中定义的函数称为内层函数,可以在外层函数中调用,不能直接在调用,但可以通过外层函数传递到外面来调用。例如:1.def a():2.def b():3.return4.return5.b()运行结果出错:NameError:name b is not defined原因:函数b是在函数a的定义体中定义的嵌套函数,不能直接在函数a之外调用语言程序设计基础教程5.1函数的定义与调用外层函数通过返回内层函数的名称,可以将内层函数作为一种返回给调用者,调用者调用该函数对象可以间接调用内层函数。例如:1.def a():2.def b():3.return4.return()#第1对圆括号调用,第2对圆括号调用 返回的函数对象外层函数返回的内层函数对象称为,调用闭包函数时外层函数会保留返回前在外层函数中定义的变量和其它嵌套函数,这些保留的变量和函数称为,简称为。例如:6.c=a()#外层函数 返回的函数对象为闭包函数,赋值给函数名 后可以使用该名称调用该闭包函数,也就是调用内层函数 闭包函数的一个使用案例是装饰器,可以在不修改函数体的情况下将函数装饰为另一个函数,有兴趣可以阅读教材中相应内容。语言程序设计基础教程5.2参数传递 参数传递是调用函数时将实参值赋值给形参的过程。当形参的值是不可变数据值时,函数体无法影响到实参的值,如右例第8行所示。当形参得到的值是可变数据值时,函数体中通过形参对值的修改会影响到实参的值,如右例第9行所示。当形参得到的值是可变数据值时,函数体中对形参赋新值,形参会失去对实参值的引用,对新值的修改不会影响到实参的值,如右例第10行所示。例如:1.def a(s):2.s=s+13.def b(s):4.s0=45.def c(s):6.s=37.s0=48.x=0;a(x);print(x)#x值不变9.x=2;b(x);print(x)#x值会变10.x=2;c(x);print(x)#x值不变语言程序设计基础教程5.2参数传递 函数定义时,形参后面可以带上默认值,称为。例如:1.def f(,):2.return a+b+c+d 函数调用时,默认值形参可以不提供实参值,直接使用自带默认值作为形参的值。例如:3.print(f)不带默认值的形参称为,函数定义时必须放置在默认值形参之前,函数调用时必须提供足够多的实参为每个位置形参提供值,多出来的实参会使默认值形参不使用默认值而使用实参值。例如:1.def f(,=3,d=4):2.return a+b+c+d4.print(f(,)语言程序设计基础教程5.2参数传递 函数定义时,形参前面可以带上 号,称为。例如:1.def f(a=1,b=2,*,c=3,d=4):2.return a+b+c+d 函数调用时,该形参位置之前的形参没用完的实参会被打包为元组,作为该可变长位置形参的实参值。例如:3.print(f(5,6,)函数调用时,该形参位置之后的形参无法通过位置方式获得实参值,可以将这些形参定义为默认值形参,也可以通过带形参名的提供值。1.def f(a,b,*p,c,d=4):2.return a+b+c+d4.print(f(5,6,)函数调用时,通过位置方式提供的实参称为,必须放置在关键字实参之前。语言程序设计基础教程5.2参数传递 例如:1.def f(a,b,*p,c=3,d=4):#第3个以后的位置实参打包给p2.print(p)3.return a+b+c+d4.print(f(10,20,30,40)#30,40打包给p1.def f(a,b,c=3,d=4,*p):#第5个以后的位置实参会打包给p2.print(p)3.return a+b+c+d4.print(f(10,20,30)#只有3个位置实参,p为空元组1.def f(a,*p,b,c=3,d=4):#第2个以后的位置实参打包给p2.print(p)3.return a+b+c+d4.print(f(10,30,40,b=20,c=6)#30,40打包给p,形参,得到关键字实参值,5.print(f(10,b=20,30,40)运行结果出错:SyntaxError:positional argument follows keyword argument原因:关键字实参放置在位置实参,之前语言程序设计基础教程5.2参数传递 函数定义时,形参前面可以带上号,称为,这种可变长形参必须放置在所有形参的最后,函数调用时用于获取没有对应形参名的关键字实参,这些关键字实参会被打包成字典赋值给可变长关键字形参。例如:1.def f(a,b,c=3,d=4,*):2.print(q)3.return a+b+c+d4.print(f(5,6,d=7,e=8)函数定义时,如果只提供一个可变长位置形参和一个可变长关键字形参,在函数调用时,可以提供任意多个实参,其中的位置实参和关键字实参会被分别打包赋值给这两个可变长形参。例如:1.def f(*,*):2.print(p)3.print(q)4.return5.f(1,2,c=3,d=4,e=5)语言程序设计基础教程5.2参数传递 【例【例5-135-13】编写求函数位置实参和关键字实参个数的函数。】编写求函数位置实参和关键字实参个数的函数。程序代码:1.def f(*p,*q):2.return len(p),len(q)3.i,j=f(1,2,3,4,a=5,b=6)4.print(位置实参个数:,i,关键字实参个数,j)程序的运行结果:分析程序:函数f定义中通过两个可变长形参,可以接收任意多个实参调用函数f返回的结果是由 和 接收的元组和字典的长度组成的二元组第3行,调用函数f时,可变长位置形参 接收到元组(1,2,3,4),可变长关键字形参 接收到字典a:5,b:6,然后将返回长度二元组给变量,语言程序设计基础教程5.35.3变量作用域变量作用域 变量通过赋值产生,这时就定义了一个变量。在函数内定义的变量具有,不能在函数外使用,也不能在其它函数内使用。在函数之外定义的变量,属于主程序部分(主控部分),具有,变量定义后可以在随后调用的函数中使用,但不能在函数内重新赋值。例如:1.def a():2.x=10#局部变量3.return x+y4.y=20#全局变量5.print(a()语言程序设计基础教程5.3变量作用域 【例【例5-155-15】全局变量在嵌套定义的函数中使用。】全局变量在嵌套定义的函数中使用。程序代码:1.x=10#全局变量2.def a():3.def b():4.return x+y#全局变量x,y5.return b()*x#全局变量x6.y=20#全局变量7.print(a()8.y=30#修改已定义的全局变量9.print(a()分析程序:第2-5行是函数a的定义,函数a中嵌套定义了函数b 第7,9行是函数a的调用,调用时变量x,y已经定义产生,可以在函数a和嵌套的内层函数b中使用,但不能在函数中被赋值 如果在函数中有对x,y的赋值操作,则变量x,y会认为是该函数中定义的变量,也无法再使用全局的同名变量x,y语言程序设计基础教程5.3变量作用域全局变量想要在函数中使用赋值操作,必须对变量进行。例如:global x,y声明语句之后,全局变量使用赋值操作不会产生新的局部变量,可以更改全局变量。使用了声明语句声明的变量,在声明语句之前不允许使用。例如:1.def a():2.print(x,y)3.global x,y4.return运行结果出错:原因:使用示例:1.def a():2.global y#变量y声明为全局变量3.y=y+10#修改全局变量y4.def b():5.return x+y6.return b()*x7.x=y=108.print(a()#调用a前变量y=10,调用后y=209.print(a()#调用a前变量y=20,调用后y=30语言程序设计基础教程5.3变量作用域【例【例5-165-16】编写判断素数的函数,使用函数找出】编写判断素数的函数,使用函数找出100100到到150150之间的所有素数。之间的所有素数。程序代码:1.def isprime(x):2.if x2:3.return False4.else:5.for i in range(2,x):6.if x%i=0:7.return False8.else:9.return True10.for x in range(100,151):11.if isprime(x):12.print(x,end=;)分析程序:第1-9行是函数isprime的定义,第10-12行是主程序 函数的形参x、第5行中使用的变量i,都是局部变量,只能在函数中使用,在主程序中无法使用 第10行的循环产生了全局变量x,与函数中的行参x同名,所以不能在函数体中使用,在函数体中使用的x是形参x。形参x的实参值是不可变数据,函数体中对形参x的修改不会影响到主程序中的实参x。形参x只能是局部的变量,不能进行全局声明语言程序设计基础教程5.3变量作用域嵌套定义的函数可以直接使用外层函数中定义的变量,但如果在嵌套函数中对外层的变量使用赋值操作,则会产生一个新的局部变量。例如:1.def a():2.x=10#没有全局声明,x是创建于函数a的局部变量3.def b():#嵌套定义的函数4.x=20#赋值操作创建了函数 的局部变量5.return 6.b()7.print(x)#结果为8.return9.x=3010.a()#主程序中创建的全局变量11.print(x)#结果为外层变量想要在内层函数中使用赋值操作,必须对变量进行局部声。例如:nonlocal x声明语句之后,外层变量使用赋值操作不会产生新的局部变量,可以更改外层变量。使用了声明语句声明的变量,在声明语句之前不允许使用。例如:1.def a():2.x=10#没有全局声明,x是创建于函数a的局部变量3.def b():#嵌套定义的函数4.nonlocal x#声明x是外层变量5.x=206.return 7.b()8.print(x)#结果为9.return10.x=3011.a()#主程序中创建的全局变量12.print(x)#结果为语言程序设计基础教程5.3变量作用域【例【例5-175-17】编写一个函数,每次调用函数会产生一个】编写一个函数,每次调用函数会产生一个FibonacciFibonacci序列中的数。序列中的数。程序代码:1.def fcreator():2.n=0#变量n用来统计调用函数的次数3.x1=x2=1#变量x1和x2用来保存序列的前两个数4.def f():#函数f是允许外界使用的5.nonlocal n,x1,x2#声明对闭包空间中的变量的6.n=n+17.if n3:8.return 19.else:10.x1,x2=x2,x1+x2#更新闭包中保存的前两个数11.return x212.return f#函数fcreator返回的是闭包函数13.f=fcreator()#创建一个给函数名14.for i in range(5):15.print(f(),end=;)#每调用一次 会得到一个新序列数分析程序:第4-11行是嵌套定义的闭包函数 的定义,该函数利用闭包空间保存前两次生成的序列数,然后使用这两个数得到新的序列数并返回该数作为结果 第14-15行调用闭包函数 5次,由于有闭包空间保存运行的状态,每次调用得到的数都是不同的语言程序设计基础教程5.45.4 lambda lambda表达式函数表达式函数 lambda函数是用一个表达式定义的函数,该表达式的结果是函数的返回值,不用return语句返回值。例如:lambda x:x*2 lambda函数的形参和实参与def定义的函数是一样的,lambda函数可以不用取函数名,直接定义后就调用。例如:(lambda x,y=2:x*y)(4,y=3)#定义后直接调用,不用函数名 lambda函数非常适合作为另一个函数的函数对象实参例如:求1.100的平方根之和的lambda编程:1.print(sum(map(lambda x:x*0.5,range(1,101)#lambda函数作为map函数的实参,x是待映射的成员,返回的结果是映射后的值语言程序设计基础教程5.4 lambda表达式函数【例【例5-185-18】对下面字典形式记录的学生成绩列表按成绩的降序排序,然后一行一个】对下面字典形式记录的学生成绩列表按成绩的降序排序,然后一行一个显示输出显示输出。学生成绩列表如下,5个字典成员构成:1.姓名:张诺,成绩:79,2.姓名:朱梦,成绩:61,3.姓名:刘玲,成绩:70,4.姓名:李纲,成绩:82,5.姓名:王怡,成绩:83语言程序设计基础教程5.4 lambda表达式函数程序代码:1.data=姓名:张诺,成绩:79,姓名:朱梦,成绩:61,姓名:刘玲,成绩:70,姓名:李纲,成绩:82,姓名:王怡,成绩:832.for d in data:3.print(姓名,d姓名,成绩,d成绩)4.for i,d in enumerate(sorted(data,key=lambda x:x成绩,reverse=True):5.print(排名,i+1,姓名,d姓名,成绩,d成绩)分析程序:第2-3行的代码是一行一个人按原始顺序显示学生成绩。第4行sorted函数的形参名为key的关键字实参用来提供排序的依据,这里使用lambda函数作为key的实参lamba函数的形参x表示了待排序列表data中的成员,lambda函数的返回值作为成员排序的依据,即取出成员的成绩值进行从大到小降序排序。enumerate函数为每个排序后的列表成员按先后顺序设定一个0开始的序号,并返回序号和成员二元组组成的列表作为结果语言程序设计基础教程第第5 5章章函数函数The End!
展开阅读全文
相关文档
相关搜索

最近上传DOC

最近上传PPT

最近上传RAR


当前位置:首页 > IT大数据 > 计算机


黔ICP备20002965号-1  在线客服QQ:365045600

Copyright © 2020-2023 www.xinwenku.com All rights reserved 新文库网 版权所有