Python程序设计-清华大学出版社-董付国第5章-函数的设计和使用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第5章函数的设计和使用将可能需要反复执行的代码封装为函数,并在需要该段代码功能的地方调用,不仅可以实现代码的复用,更重要的是可以保证代码的一致性,只需要修改该函数代码则所有调用均受到影响。5.1函数定义def函数名([参数列表]):'''注释'''函数体5.1函数定义斐波那契数列deffib(n):a,b=0,1whilean:print(a,end='')a,b=b,a+bprint()fib(1000)5.1函数定义在定义函数时,开头部分的注释并不是必需的,但是如果为函数的定义加上这段注释的话,可以为用户提供友好的提示和使用帮助。例如,把上面生成斐波那契数列的函数定义修改为下面的形式,加上一段注释。deffib(n):'''acceptanintegern.returnthenumberslessthanninFibonaccisequence.'''a,b=1,1whilean:print(a,end='')a,b=b,a+bprint()5.1函数定义5.2形参与实参函数定义时括弧内为形参,一个函数可以没有形参,但是括弧必须要有,表示该函数不接受参数。函数调用时向其传递实参,将实参的值或引用传递给形参。在函数内直接修改形参的值不影响实参。5.2形参与实参例1:编写函数,接受两个整数,并输出其中最大数。defprintMax(a,b):ifab:pirnt(a,'isthemax')else:print(b,'isthemax')这个程序并不是很好,如果输入的参数不支持比较运算,会出错。5.2形参与实参对于绝大多数情况下,在函数内部直接修改形参的值不会影响实参。例如下面的示例:defaddOne(a):print(a)a+=1print(a)a=3addOne(a)34a35.2形参与实参在有些情况下,可以通过特殊的方式在函数内部修改实参的值,例如下面的代码。defmodify(v):#修改列表元素值v[0]=v[0]+1a=[2]modify(a)a[3]defmodify(v,item):#为列表增加元素v.append(item)a=[2]modify(a,3)a[2,3]defmodify(d):#修改字典元素值或为字典增加元素d['age']=38a={'name':'Dong','age':37,'sex':'Male'}a{'age':37,'name':'Dong','sex':'Male'}modify(a)a{'age':38,'name':'Dong','sex':'Male'}5.3参数类型在Python中,函数参数有很多种:可以为普通参数、默认值参数、关键参数、可变长度参数等等。Python函数的定义非常灵活,在定义函数时不需要指定参数的类型,也不需要指定函数的类型,完全由调用者决定,类似于重载和泛型;函数编写如果有问题,只有在调用时才能被发现,传递某些参数时执行正确,而传递另一些类型的参数时则出现错误。5.3.1默认值参数def函数名(形参名=默认值,……)函数体默认值参数必须出现在函数参数列表的最右端,且任何一个默认值参数右边不能有非默认值参数。5.3.1默认值参数调用带有默认值参数的函数时,可以不对默认值参数进行赋值,也可以赋值,具有较大的灵活性。defsay(message,times=1):printmessage*timessay('hello')hellosay('hello',3)hellohellohellosay('hi',7)hihihihihihihi5.3.1默认值参数再例如,下面的函数使用指定分隔符将列表中所有字符串元素连接成一个字符串。defJoin(List,sep=None):return(sepor'').join(List)aList=['a','b','c']Join(aList)'abc'Join(aList,',')'a,b,c'5.3.1默认值参数默认值参数如果使用不当,会导致很难发现的逻辑错误,例如:defdemo(newitem,old_list=[]):old_list.append(newitem)returnold_listprintdemo('5',[1,2,3,4])#rightprintdemo('aaa',['a','b'])#rightprintdemo('a')#right#printdemo.func_defaultsprintdemo('b')5.3.1默认值参数改成下面的样子就不会有问题了:defdemo(newitem,old_list=None):ifold_listisNone:old_list=[]old_list.append(newitem)returnold_listprintdemo('5',[1,2,3,4])#rightprintdemo('aaa',['a','b'])#rightprintdemo('a')#right#printdemo.func_defaultsprintdemo('b')5.3.1默认值参数默认参数只被解释一次可以使用函数名.func_defaults查看默认参数的当前值5.3.2关键参数关键参数主要指实参,即调用函数时的参数传递方式。通过关键参数传递,实参顺序可以和形参顺序不一致,但不影响传递结果,避免了用户需要牢记位置参数顺序的麻烦。defdemo(a,b,c=5):printa,b,cdemo(3,7)375demo(a=7,b=3,c=6)736demo(c=8,a=9,b=0)9085.3.3可变长度参数可变长度参数主要有两种形式:*parameter和**parameter,前者用来接受多个实参并将其放在一个元组中,后者接受字典形式的实参。5.3.3可变长度参数defdemo(*p):printpdemo(1,2,3)(1,2,3)demo(1,2)(1,2)demo(1,2,3,4,5,6,7)(1,2,3,4,5,6,7)5.3.3可变长度参数defdemo(**p):foriteminp.items():printitemdemo(x=1,y=2,z=3)('y',2)('x',1)('z',3)5.3.3可变长度参数几种不同类型的参数可以混合使用,但是不建议这样做deffunc_4(a,b,c=4,*aa,**bb):print(a,b,c)printaaprintbbfunc_4(1,2,3,4,5,6,7,8,9,xx='1',yy='2',zz=3)(1,2,3)(4,5,6,7,8,9){'yy':'2','xx':'1','zz':3}func_4(1,2,3,4,5,6,7,xx='1',yy='2',zz=3)(1,2,3)(4,5,6,7){'yy':'2','xx':'1','zz':3}5.3.4参数传递的序列解包传递参数时,可以通过在实参序列前加星号将其解包,然后传递给多个单变量形参。defdemo(a,b,c):printa+b+cseq=[1,2,3]demo(*seq)65.4return语句return语句用来从一个函数中返回,即跳出函数,也可用return语句从函数中返回一个值。如果函数没有return语句,Python将认为该函数以returnNone结束。defmaximum(x,y):ifxy:returnxelse:returny在调用内置数据类型的方法时,一定要注意该方法有没有返回值。5.5变量作用域变量起作用的范围称为变量的作用域。一个变量在函数外部定义和在函数内部定义,其作用域是不同的。局部变量的引用比全局变量速度快。5.5.1局部变量在函数内定义的变量只在该函数内起作用,称为局部变量。函数结束时,其局部变量被自动删除。5.5.2全局变量如果想要在函数内部给一个定义在函数外的变量赋值,那么这个变量就不能是局部的,其作用域必须为全局的,能够同时作用于函数内外,称为全局变量,可以通过global来定义。(1)一个变量已在函数外定义,如果在函数内需要为这个变量赋值,并要将这个赋值结果反映到函数外,可以在函数内用global声明这个变量,将其定义为全局变量。(2)在函数内部直接将一个变量声明为全局变量,在函数外没有声明,在调用这个函数之后,将增加为新的全局变量。5.5.3案例defdemo():globalxx=3y=4printx,yx=5demo()34x3y出错NameError:name'y'isnotdefineddelxx出错NameError:name'x'isnotdefineddemo()34x3y出错NameError:name'y'isnotdefined5.6lambda表达式lambda表达式可以用来声明匿名函数,即没有函数名字的临时使用的小函数,只可以包含一个表达式,且该表达式的计算结果为函数的返回值,不允许包含其他复杂的语句,但在表达式中可以调用其他函数。5.6lambda表达式f=lambdax,y,z:x+y+zprintf(1,2,3)6g=lambdax,y=2,z=3:x+y+zprintg(1)6printg(2,z=4,y=5)11L=[(lambdax:x**2),(lambdax:x**3),(lambdax:x**4)]printL[0](2),L[1](2),L[2](2)4816D={'f1':(lambda:2+3),'f2':(lambda:2*3),'f3':(lambda:2**3)}printD['f1'](),D['f2'](),D['f3']()568L=[1,2,3,4,5]printmap((lambdax:x+10),L)[11,12,13,14,15]L[1,2,3,4,5]5.6lambda表达式defdemo(n):returnn*ndemo(5)25a_list=[1,2,3,4,5]map(lambdax:demo(x),a_list)[1,4,9,16,25]5.6lambda表达式data=range(20)printdata[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]importrandomrandom.shuffle(data)data[4,3,11,13,12,15,9,2,10,6,19,18,14,8,0,7,5,17,1,16]data.sort(key=lambdax:x)data[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]data.sort(key=lambdax:len(str(x)))data[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]data.sort(key=lambdax:len(str(x)),reverse=True)data[10,11,12,13,14,15,16,17,18,19,0,1,2,3,4,5,6,7,8,9]5.7案例精选例1:编写函数计算圆的面积。frommathimportpiasPIimporttypesdefCircleArea(r):ifisinstance(r,int)orisinstance(r,float):#确保接收的参数为数值returnPI*r*relse:print('Youmustgivemeanin

1 / 48
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功