辽宁大学《计算机基础》课件-第8章函数_第1页
辽宁大学《计算机基础》课件-第8章函数_第2页
辽宁大学《计算机基础》课件-第8章函数_第3页
辽宁大学《计算机基础》课件-第8章函数_第4页
辽宁大学《计算机基础》课件-第8章函数_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章函数大学IT(数据科学基础)辽宁大学《计算机基础》E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C24361410目录8.1函数简介8.2函数的定义与调用8.3函数参数8.4匿名函数8.5函数的嵌套8.6变量作用域8.7常用系统函数8.8函数应用示例E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C24361410教学目标了解模块化程序设计思想,理解函数的作用掌握自定义函数的定义与调用掌握函数不同形式参数的使用掌握匿名函数的使用掌握函数的嵌套定义及调用理解变量的作用域掌握常用系统函数的使用E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.1函数简介函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。它的作用主要是提高应用的模块性和代码的重复利用率,方便对程序进行模块化处理,尽量减少代码冗余。软件开发过程中,经常有很多操作是完全相同或者相似的,仅仅是处理的数据不同而已,此时就可将这些需要反复执行的代码封装成函数,然后在需要该功能的地方调用封装好的函数即可,不仅可实现代码的复用,同时也方便代码的维护。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.1函数简介函数分为两大类,一类是系统提供的函数,如input()、print()等,这些函数功能是由系统已经事先定义好了,用户可直接调用。还有一类函数是自定义函数,也即用户可以根据自己的需要自行定义函数,然后通过调用函数来实现相应的功能。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.2函数的定义与调用函数的定义def函数名([形参表]):

函数体

说明:函数代码块以def关键字开头,后跟函数名、圆括号和冒号,然后是函数体,函数体相对于def关键字有一定的缩进。函数的命名规则与变量命名规则相同。[形参表]为可选项,即使函数没有形参,函数名后面的圆括号也不能省略。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.2函数的定义与调用函数体中可利用return[表达式]

返回值给调用方,不带表达式的return或没有return语句系统自动返回None。在定义函数时,为提高代码可读性,可以在函数体开头加上注释来说明函数的功能。例:定义一个求两个数乘积的函数。defmul(a,b): '''求两个数的乘积''' returna*bE6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.2函数的定义与调用函数的调用函数定义好后,就可以在程序中使用这一函数,称之为函数的调用。函数调用格式:函数名([实参表])例如调用上述mul()函数来求4和5的乘积:mul(4,5)有返回值的函数可以做为表达式的一部分或是做为另一个函数的参数,没有返回值的函数通常作为一条独立的语句执行。Python中函数必须先定义,后调用。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.2函数的定义与调用【例8-1】利用自定义函数来求两个数中的最大数。#函数定义defmymax(n1,n2):"""求两个数的最大值"""ifn1>n2:returnn1else:returnn2

#函数调用print(mymax(3,4))【运行结果】4lt0801E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.2函数的定义与调用交互模式下实现:>>>defmymax(n1,n2):#函数定义 ifn1>n2: returnn1 else: returnn2

>>>mymax(3,4)#函数调用4>>>mymax(4,5)5E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.2函数的定义与调用【例8-2】利用自定义函数输出如下信息********************Hello,Python!********************#函数定义defprint_head():"""输出表头"""print("*"*20)print("Hello,Python!")print("*"*20)

#函数调用print_head()lt0802E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.2函数的定义与调用【例8-3】利用自定义函数求一个数的平方、3次方和4次方。>>>deffun_demo(n): returnn**2,n**3,n**4

>>>fun_demo(2)(4,8,16)>>>x=fun_demo(2)>>>x(4,8,16)>>>x1,x2,x3=fun_demo(2)>>>x14>>>x28>>>x316Python中函数可以有多个返回值。注意调用时如果要将其返回值赋给变量时,要么赋给一个变量,此变量相当于一个元组,要么赋给若干个变量(个数须与返回值个数相对应),系统自动将其依次赋值给每个变量。lt0803E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数参数传递在Python中,函数调用时,实参向形参的数据传递是单向传递,也即实参数据传递给形参,而不能由形参传回给实参。当函数获得实参后,如果函数体内部有对形参的改变,函数体内对形参的改变会不会影响到实参,这取决于传递的参数类型。在python中,像字符串、元组、数字等是不可更改的对象,称之为不可变类型,而列表、字典等则是可以修改的对象,称之为可变类型。如果传递的数据是不可变类型时,那么在函数体内对形参的修改不会影响到实参;如果传递的是可变类型时,那么在函数体内对形参的修改可能会影响到实参。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数例:>>>deftest_demo1(n): n=10>>>m=5#m为不可变类型>>>test_demo1(m)>>>m#函数调用后其值没有改变5t08031E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数例:>>>deftest_demo2(n): n.append(5)>>>m=[1,2,3]#m为可变类型对象>>>test_demo2(m)>>>m#函数调用后其值发生了改变[1,2,3,5]E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数参数形式1、位置参数位置参数是较常用的一种,也称为必需参数,函数调用时实参须以正确的顺序传给形参。实参数量必须和形参数量一样。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数例:>>>defdemo1(n1,n2):#位置参数 print(n1,n2)>>>demo1(3,4)#数量顺序一一对应34>>>demo1(4,3)43>>>demo1(3)#实参数量与形参数量不相同抛出异常Traceback(mostrecentcalllast):File"<pyshell#66>",line1,in<module>demo1(3)TypeError:demo1()missing1requiredpositionalargument:'n2'T08032-1E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数参数形式2、关键字参数函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为Python解释器能够用参数名匹配参数值。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数例:>>>defdemo2(name,age): print("name:",name) print("age:",age)>>>demo2("王芳",23)#使用位置参数调用name:王芳age:23>>>demo2(name="王芳",age=23)#使用关键字参数调用,次序任意name:王芳age:23>>>demo2(age=23,name="王芳")#使用关键字参数调用,次序任意name:王芳age:23E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数参数形式3、默认值参数在定义函数时,可以给参数赋一个默认值。函数调用时,如果该参数没有被传递值,将使用该默认值。默认值参数必须出现在函数参数列表的最右端。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数例:>>>defdemo3(name,age=23): print("name:",name) print("age:",age)>>>demo3("王芳")#使用默认值参数调用name:王芳age:23>>>demo3("王芳",25)#使用位置参数调用name:王芳age:25>>>demo3(age=25,name="王芳")#使用关键参数调用name:王芳age:25E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数参数形式4、不定长参数当需要一个函数能处理比当初声明时更多的参数这时就可用不定长参数(或叫可变长度参数)。不定长参数在函数定义时主要有两种形式:*变量名和**变量名,用以接收不定长参数。前者用于接收任意多个实参并将其放在一个元组中,后者接收类似于关键参数一样显式赋值形式的多个实参并将其放于一个字典中。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数例:>>>defdemo4(arg1,*arg2):#第一个参数为位置参数,第二个为不定长参数 print("arg1=",arg1) print("arg2=",arg2) >>>demo4(2)#只给出位置参数arg1=2arg2=()>>>demo4(2,3,4)#位置参数和可变长参数arg1=2arg2=(3,4)T08032-2E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数>>>demo4()#位置参数必须给出,否则抛出异常Traceback(mostrecentcalllast):File"<pyshell#98>",line1,in<module>demo4()TypeError:demo4()missing1requiredpositionalargument:'arg1'E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数>>>defdemo5(**args):#接收的不定长参数放于字典中 print("args=",args)>>>demo5()args={}>>>demo5(x=1,y=2)#参数须以关键参数形式给出args={'x':1,'y':2}>>>demo5(x=1,y=2,z=3)args={'x':1,'y':2,'z':3}E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数序列解包调用包含多个参数的函数时,可以使用列表、元组、字典、集合及其它可迭代对象作为实参,通过在实参名前加一个星号*,python解释器将自动对其进行解包,然后传递给多个单变量形参。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数例:>>>defdemo6(a,b,c): returna+b+c>>>demo6(*[2,3,4])#列表序列解包9>>>demo6(*(2,3,4))#元组序列解包9>>>demo6(*{2,3,4})#集合序列解包9>>>demo6(*{2:"a",3:"b",4:"c"})#字典序列解包,解包时默认传递的是键9>>>demo6(*{2:"a",3:"b",4:"c"}.values())#字典序列解包,传递其值'abc't08033E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数调用函数时如果对实参使用一个星号*进行序列解包,这么这些解包后的实参将会被当做位置参数对待,并且会在关键字参数和使用两个星号**进行序列解包的参数之前进行处理。例:>>>defdemo7(a,b,c): print(a,b,c)>>>demo7(*(1,2,3))#序列解包123>>>demo7(1,*(2,3))#位置参数和序列解包同时使用123E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数>>>demo7(a=1,*(2,3))#序列解包相当于位置参数,优先处理Traceback(mostrecentcalllast):File"<pyshell#128>",line1,in<module>demo7(a=1,*(2,3))TypeError:demo7()gotmultiplevaluesforargument'a'>>>demo7(c=1,*(2,3))#序列解包相当于位置参数,优先处理231E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.3函数参数#序列解包不能在关键字参数解包之后>>>demo7(**{'a':1,'b':2},*(3,))SyntaxError:iterableargumentunpackingfollowskeywordargumentunpacking#序列解包须在关键字参数解包之前>>>demo7(*(3,),**{'c':1,'b':2})321不同形式的函数参数可以混合使用,混合使用时应遵循以下原则:先位置参数,再关键字参数,然后可变参数,可变参数中如果*arg和**arg同时出现,应先*arg后**arg。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.4匿名函数匿名函数匿名函数是没有函数名、临时使用的小函数,多用于需要一个函数作为另一个函数参数的场合。Python中使用lambda表达式来创建匿名函数。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.4匿名函数匿名函数的定义格式:lambda[arg_list]:expression其中,lambda是Python预留的关键字,arg_list为形参列表,4种参数形式(位置参数、关键字参数、默认值参数、不定长参数)皆可;expression为函数体,只允许包含一个表达式,不允许包含其它复杂语句,但在表达式中可调用其它函数,以实现较复杂的业务逻辑。例:lambdax,y:x+yE6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.4匿名函数lambda表达式的结果相当于函数的返回值,可将lambda表达式赋值给一个变量,然后使用这个变量来进行函数调用,这里变量就相当于函数名。lambda表达式拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。例:#将lambda表达式赋给一个变量>>>total=lambdaa,b:a+b>>>total(3,4)#通过变量名来调用函数7t08041E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.4匿名函数>>>total=lambdaa,b=4:a+b#lambda表达式支持默认值参数>>>total(3)7>>>total(b=5,a=6)#支持关键字参数11>>>total=lambda*arg:print("arg=",arg)#支持不定长参数>>>total()arg=()>>>total(2,3,4)arg=(2,3,4)E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.4匿名函数lambda表达式中可调用其它函数,例:>>>defdemo(n):#定义一个函数 returnn**2,n**3,n**4>>>demo(2)(4,8,16)>>>result=lambdan:demo(n)#表达式中可调用其它函数>>>result(2)(4,8,16)E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.4匿名函数匿名函数的使用匿名函数的使用实际上就是定义一个lambda表达式。在实际中,根据这个lambda表达式应用场景的不同,可以将lambda表达式的用法大体分为以下几种。1、将lambda表达式赋值给一个变量,通过这个变量间接调用该匿名函数。2、将lambda表达式作为其他函数的返回值,返回给调用者。3、将lambda表达式作为参数传递给其他函数E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.4匿名函数1、将lambda表达式赋值给一个变量,通过这个变量间接调用该匿名函数。例:>>>total=lambdaa,b:a+b#将lambda表达式赋给一个变量>>>total(3,4)#通过变量名来调用函数7>>>L=[(lambdax:x**2),(lambdax:x**3),(lambdax:x**4)]>>>print(L[0](2),L[1](2),L[2](2))4816>>>D={'f1':(lambda:2+3),'f2':(lambda:2*3),'f3':(lambda:2**3)}>>>print(D['f1'](),D['f2'](),D['f3']())568t08042E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.4匿名函数2、将lambda表达式作为其他函数的返回值,返回给调用者。函数的返回值也可以是函数,例如returnlambdax,y:x+y返回一个加法函数。这时,lambda函数实际上是定义在某个函数内部的函数,称之为嵌套函数,或者内部函数。例:>>>defdemo(): returnlambdax:x*2>>>demo()(3)6E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.4匿名函数3、将lambda表达式作为参数传递给其他函数部分Python内置函数接收函数作为参数,常用的此类内置函数有map()、sorted()、filter()、reduce()等。内建函数sorted中的参数key可用lambda表达式来实现较复杂的排序规则。例:>>>data=list(range(20))#创建列表>>>importrandom#导入random模块>>>random.shuffle(data)#将data中数据打乱顺序>>>data[4,3,11,13,12,15,9,2,10,6,19,18,14,8,0,7,5,17,1,16]E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.4匿名函数>>>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)),reverse=True)>>>data[10,11,12,13,14,15,16,17,18,19,0,1,2,3,4,5,6,7,8,9]E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.4匿名函数对类似矩阵形式的数据的排序:首先生成一个矩阵:>>>importrandom>>>x=[random.sample(range(20),5)foriinrange(5)]#包含5个子列表的列表(也即矩阵),每个子列表中包含5个0到20之间的随机数>>>foriteminx: print(item) [1,0,5,3,16]#待排序数据[18,13,17,11,16][11,6,10,2,15][11,12,2,15,1][4,1,5,2,12]E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.4匿名函数#先按矩阵中第1列升序排序,第1列相同再按第5列升序排序>>>y=sorted(x,key=lambdaitem:(item[0],item[4]))>>>foriteminy: print(item) [1,0,5,3,16]#排序结果[4,1,5,2,12][11,12,2,15,1][11,6,10,2,15][18,13,17,11,16]E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.5函数的嵌套函数的嵌套函数的嵌套包括函数的嵌套调用和嵌套定义,多数语言中只支持函数的嵌套调用,Python中既支持函数的嵌套调用也支持函数的嵌套定义。函数的嵌套调用是指在定义一个函数时又调用了别的函数(如果函数在定义时又直接或间接调用了其自身,就构成了函数的递归);函数的嵌套定义是指在一个函数的函数体内部还可以再定义一个函数,将定义在某个函数内部的函数,称之内部函数,将包含内部函数的函数称之为外部函数。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.5函数的嵌套

Lt0804-1E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.5函数的嵌套

Lt0804-2E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.5函数的嵌套【例8-5】利用函数递归求n!。deffac(n):ifn==1:return1else:returnn*fac(n-1)

print("5!=",fac(5))lt0805E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.6变量作用域变量作用域在Python中,程序中用到的变量并不是在任何位置都可以访问的,访问权限取决于这个变量是在哪里赋值的。变量起作用的代码范围称为变量的作用域。变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:(1)L(Local)局部作用域(2)E(Enclosing)闭包函数外的函数中(3)G(Global)全局作用域(4)B(Built-in)内建作用域以L–>E–>G–>B的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,最后去内建中找。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.6变量作用域局部变量和全局变量在函数内部定义的变量称为局部变量;在函数外部定义的变量称为全局变量。一个变量在函数外部定义和在函数内部定义,其作用域是不同的。局部变量的作用域是函数内部,当函数执行结束后,局部变量自动删除,不再可以使用。全局变量的作用域是从其定义处开始到程序结束,结束后仍保留。不同作用域内变量名可以相同,互不影响。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.6变量作用域【例8-6】局部变量和全局变量的使用total=0#全局变量

deffunc1(m,n):total=m+n#局部变量print("函数内部total=",total)

print("函数调用前:")print("函数外部total=",total)func1(5,4)print("函数调用后:")print("函数外部total=",total)lt0806E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.6变量作用域【运行结果】函数调用前:函数外部total=0函数内部total=9函数调用后:函数外部total=0此例中,在函数外部定义一个全局变量total,在函数内部定义了一个局部变量total,两者尽管名字相同,但表示的是不同的变量,由程序运行结果也可看出。如果想在函数内部使用函数外部定义的total变量,这时就须用到关键字global。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.6变量作用域global关键字在Python中,在函数内如果只引用某个变量的值而没有为其赋新值,该变量为(隐式的)全局变量;如果在函数内任意位置有为变量赋新值的操作,该变量即被认为是(隐式的)局部变量,除非在函数内显式地用关键字global进行声明,global的作用就是将此变量声明为全局变量,而不再是内部变量。global声明的变量既可以是已经在函数外部定义过的,也可以是在函数外没有定义过的。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.6变量作用域【例8-7】global关键字使用total=0#全局变量

deffunc1(m,n):globaltotal#将total声明为全局变量total=m+n#使用全局变量print("函数内部total=",total)

print("函数调用前:")print("函数外部total=",total)func1(5,4)print("函数调用后:")print("函数外部total=",total)【运行结果】函数调用前:函数外部total=0函数内部total=9函数调用后:函数外部total=9lt0807-1E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.6变量作用域也可以直接用global在函数内部声明一个全局变量,例:deffunc1(m,n):globaltotal#声明total为全局变量total=m+n#使用全局变量print("函数内部total=",total)

func1(5,4)print("函数调用后:")print("函数外部total=",total)【运行结果】函数内部total=9函数调用后:函数外部total=9Lt0807-2E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.6变量作用域nonlocal关键字nonlocal关键字用于修改嵌套函数中变量的作用域。例有如下程序:deffunc_out():count=1#局部变量

deffunc_in():count=12#局部变量print("在func_in中,count=",count)

func_in()print("在func_outer中,count=",count)

func_out()Lt0808-1E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.6变量作用域此程序中外部函数func_out中定义了一个局部变量count,内部函数func_in中也定义了一个局部变量count,此时程序运行结果为:在func_in中,count=12在func_outer中,count=1如果函数func_in中想使用func_out函数中的变量count,此时就不能用global来声明(因global声明的是全局变量),这时就可用nonlocal关键字来声明。将上述程序改写如下:E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.6变量作用域【例8-8】nonlocal使用deffunc_out():count=1#局部变量

deffunc_in():nonlocalcount#非局部变量count=12print("在func_in中,count=",count)

func_in()print("在func_outer中,count=",count)

func_out()【运行结果】在func_in中,count=12在func_outer中,count=12Lt0808-1Lt0808-2E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数Python中提供了大量的系统函数供程序设计人员使用,这些函数有的是在基本模块中,可直接使用,称为内置函数,还有些函数是在不同的标准模块中,使用时需先将其所在的库导入进来,然后才能使用。可以在交互模式下使用命令help(函数名)来查看某个内置函数的用法,例help(abs);也可使用help(模块名)来查看某模块的帮助文档,如help(‘math’)。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数常用数学函数函数功能说明abs(x)返回数字x的绝对值或复数x的模complex(real,[imag])以指定的实部real、虚部image返回一复数max(iterable

*[,default=obj,key=func])max(arg1,arg2,

*args,*[,key=func])求最大值,参数可以是一迭代对象,也可以是一组数据,要求所有元素之间可比较大小,允许指定排序规则和可迭代对象为空时返回的默认值min(iterable

*[,default=obj,key=func])min(arg1,arg2,

*args,*[,key=func])求最小值,参数可以是一迭代对象,也可以是一组数据,要求所有元素之间可比较大小,允许指定排序规则和可迭代对象为空时返回的默认值sum(iterable[,start=0])求和,可以指定起始值pow(x,y[,z=None])返回x的y次方,等价于x**y或(x**y)%zround(x[,小数位数])对x进行四舍五入,若不指定小数位数,则返回整数int(x[,d])返回实数(float)、分数(Fraction)或高精度实数(Decimal)x的整数部分,或把d进制的字符串x转换为十进制并返回,d默认为十进制float(x)把整数或字符串x转换为浮点数并返回E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数>>>abs(-3)#求绝对值3>>>abs(-3+4j)#对于复数是求模5.0>>>complex(3)#只给出实部(3+0j)>>>complex(3,4)#实部、虚部都给出(3+4j)>>>max([2,3,4,9,0])#对列表求最大值9>>>max(2,3,4)#直接对一组数求最大值4t08071E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数>>>sum([2,3,4])#对列表求和9>>>sum(2,3,4)#参数必须是可迭代对象Traceback(mostrecentcalllast):File"<pyshell#109>",line1,in<module>sum(2,3,4)TypeError:sumexpectedatmost2arguments,got3>>>sum([2,3,4],100)#可以指定一累加起始值109E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数>>>pow(2,3)#求2**38>>>pow(2,3,3)#求2**3%32>>>round(123.456)#四舍五入取整123>>>round(123.456,2)#保留两位小数123.46E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数>>>int("1001",2)#二进制转十进制9>>>int("ff",16)#十六进制转十进制255>>>float("23")#字符串转浮点数23.0E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数math模块中常用函数函数功能说明ceil(x)返回数字的上入整数,如math.ceil(4.1)返回5floor(x)返回数字的下舍整数,如math.floor(4.9)返回4sqrt(x)返回x的平方根factorial(x)返回x的阶乘gcd(x,y)返回x、y的最大公约数log10(x)log10xlog2(x)log2xsin()、cos()、tan()等三角函数E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数例:>>>importmath>>>math.ceil(4.3)#上取整5>>>math.floor(4.9)#下取整4>>>math.sqrt(9)#开方3.0>>>math.factorial(5)#求5的阶乘120>>>math.gcd(6,12)#求最大公约数6E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数map()函数map()函数是系统内置函数,是Python函数式编程的重要体现。格式:map(func,*seq)功能:可将函数func(可以是系统函数也可以是自定义函数)依次作用到指定迭代器对象seq中的每个元素上,并返回一个可迭代的map对象,里面的元素是原序列中元素经过函数func处理后的结果,可将其转换成列表或元组。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数map()函数工作过程E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数例:>>>map(str,[2,3,4])#将列表中每个元素转换成字符串<mapobjectat0x0000006474F92A90>#结果为一map对象>>>list(map(str,range(5)))#可将map对象转换成列表['0','1','2','3','4']#map()中的函数也可以是自定义函数,例:>>>defadd5(x):#定义一个函数 returnx+5>>>list(map(add5,range(10)))[5,6,7,8,9,10,11,12,13,14]t08072E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数map()中可迭代对象个数取决于要作用的函数func的形参个数。例:>>>defmyadd(x,y):#有两个参数的函数returnx+y#双参数函数作用到两个序列上>>>list(map(myadd,[2,3,4],[4,5,6]))[6,8,10]E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数map()中的函数还可直接是lambda表达式,例:>>>list(map(lambdax:x+5,range(5)))[5,6,7,8,9]>>>list(map(lambdax,y:x+y,range(5),range(5)))[0,2,4,6,8]>>>list(map(lambdax,y:x+y,[1,2,3],(3,4,5)))[4,6,8]E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数zip()函数zip()函数也是内置函数。格式:zip(zip(iter1[,iter2[...]])功能:用来把多个可迭代对象中的元素压缩在一起,返回一个包含若干元组的可迭代zip对象,每个元组中数据分别来自于各个迭代对象对应位置上的元素,如果各个迭代器中的元素个数不一致,以可迭代对象中最短的那个为准。最终结果可转换为列表或元组。E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数例:>>>zip([1,2,3],[10,20,30])#返回结果是zip对象<zipobjectat0x0000006474F53B88>>>>list(zip([1,2,3],[10,20,30]))#将结果转换成列表[(1,10),(2,20),(3,30)]>>>tuple(zip([1,2,3],[10,20,30]))#将结果转换成元组((1,10),(2,20),(3,30))t08073E6636B02012BD195C019CE06C16E3004C73D0FE32711A616D0819A1C3DE998F18F196403BC41BA961B48D7F0472B73A72FC0F2BE2AA53DFE6A08217657FC1F5DBF2DB6715F2B3FB870C243614108.7常用系统函数>>>z=zip([1,2,3],[10,20,30])>>>foriinz:#遍历输出 print(i)(1,10)(2,20)(3,30)E6636B02012BD195C019CE06C16E3004C73D0FE3271

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论