当前位置: 首页 > 后端技术 > Python

Python函数

时间:2023-03-26 15:42:50 Python

作用:最大化代码复用,最小化代码冗余,流程分解(方便维护)1.函数定义函数定义后,不会执行,只会执行被调用的函数。可以由字母、数字、下划线组成,不能以数字开头`#格式:def函数名(形参,...):#形参函数体不可设置#例1:加法函数defadd(a,b):c=a+bprint("Additionresult:",c)#扩展:print(add)输出结果为方法add函数的存储空间位置#例2:减法函数defsub(a,b):c=a-bprint("减法结果:",c)`2.函数调用`#格式:函数名(输入实参值....)#例子:调用加法函数add(2,1)`3.函数返回(return)`#格式:def函数名():函数体return“返回值”#例子:defadd(a,b):c=a+bprint(c)returnc#返回值,调用哪个会返回哪个csum=add(1,2)#调用函数print("sum=",sum)`申请智汇代理https://www.kaifx.cn/broker/thinkmarkets.html注意:当函数执行完毕返回时,函数会立即终止伊利。执行函数中可以有多个return,但只会执行一个return。返回后可以没有值。return单独使用相当于returnNone4.变量作用域Scopescope:Built_in>Global>Enclosure>Local作用域采用就近原则1.Python内置函数变量Built_in:`deflen():print("Myowndefinedmethod")len("abcdef")#输出结果报错,不是执行python的内置函数len()计算长度#自己定义的len()函数覆盖了python的内置functionlen()`2.全局变量global:定义在函数外的变量,global是指当前python文件中的变量在作用域内可见,全局变量可以被当前python文件中的所有函数访问直接使用局部变量的优先级高于全局变量(变量就近原则)`#例子:a=10#全局变量,全局变量的作用域无处不在c=20deftest1():a=20#函数局部变量只能在自己的函数中使用print(a)test1()#Outputresult:20print(a)#Outputresult:10`3.封装变量Enclosure:`deffunc1():x=100defnested1():x=99print(x)nested1()print(x)func1()#Outputresult:#99#100#修改包变量:nonlocaldeffunc2():x=100defnested2():nonlocalxx=99print(x)nested2()print(x)func()#Outputresult:#99#99`4.局部变量Local:定义在函数内部的变量,只能在定义的函数内部使用。全局变量既可以作用于函数内部,也可以作用于函数外部,如果要在函数内部给定义在函数外部的变量赋值,那么这个变量就不能是局部的,它的作用域必须是全局的,可以通过global来定义。函数内定义全局变量:globalCommand`a=1deftest1():globala#函数内定义全局变量,a=10#函数内全局变量的定义格式:先定义,再赋值,不能写在一行中,否则会报错print(a)#调用函数后,全局变量可以工作print(a)test1()print("函数外调用了test1函数的全局变量:",a)#Outputresult:theglobalvariableofthetest1functioniscalledoutsidethefunction:10#Outputresult:#1Insertcodesnippethere#10#10`函数外已经定义了一个变量,如果需要的话在函数内部给这个变量赋值,想在函数外部反映赋值结果,可以在函数中用global声明这个变量,定义为全局变量。变量在函数内部直接声明为全局变量,不在函数外部声明。调用这个函数后,它会被添加为一个新的全局变量。5.参数`deffunc(a,b,c):#形式参数a,b,cprint(a,b,c)func(1,2,3)#实际参数1,2,3`1.必填可选参数(位置匹配)强制参数必须以正确的顺序传递到函数中。调用时的数必须和声明时的数一样defsub(a,b):c=a-bprint("减法结果:",c)sub(1,2)#将值传入形式参数的顺序a=1b=2输出结果:-1`2.关键字参数关键字参数与函数调用密切相关,函数调用通过关键字参数来确定传入的参数值。关键字参数的使用允许调用函数时参数的顺序不同,因为Python解释器可以将参数值与参数名匹配`defsub(a,b):c=a-bprint(c)sub(b=2,a=1)#输出结果:-1#b=2,a=1关键字参数#关键字值传递与顺序无关`注意:调用函数时,同时传递位置参数和关键字时参数,位置参数必须在key字参数前面加上:add(200,300,400,num5=100)3.默认参数(调用时省略传值)调用函数时,如果默认参数的值为不传入,视为默认值格式:`def函数名(...,...,形参名=默认值):函数体`注意:默认值参数必须出现在最右端函数参数列表,任何默认参数右边不能有非默认参数。例子:`deffunc2(a,b=2,c=3):print(a,b,c)func(1)#Outputresult:123func(1,2)#Outputresult:123func(1,c=5)#Outputresult:125`默认值参数必须出现在函数参数列表的最右端。如果某个位置的形参设置为默认参数,则该位置之后的所有参数都必须设置为默认参数。4.变长参数(在定义函数时,定义一个可以接收多参数数据的形参)函数需要处理比最初声明时更多的参数。这些参数称为可变长度参数。变长参数用于定义一个可以接受任意数量参数的函数:*args和**kwargs4.1*args*args用于接收多个实参,并放在一个元组中;*args表示多参数value传递,*为key格式,后面的名字可以随意更改`#例1:#定义计算两个科目平均分的方法defavg(score1,score2):return(score1+score2)/2#定义计算n个被试平均分的方法defavg(*scores):#定义形参时,在形参前加*,表示可以接收任意个数的实参放在一个元组返回和中(scores)/len(scores)#使用这个形参时,前面不需要加*result=avg(98.2,88.1,70,65)print(result)#Output80.325scores=(88,89,90)result2=avg(*scores)#*必须在scores变量前加上才能解包,表示元组的每个元素是分开的,否则会报错print(result2)#例2:deftest1(*args):#形参格式为:*+形参名print(args)#输出多个参数的元组数据类型#调用函数,不能passvaluebykeyword:test1(1,2,3,"xzh",18)#输出元组数据类型:(1,2,3,"xzh",18)`4.2**kwargs**kwargs接收多个实参以key参数之类的赋值形式放入字典**kwargs表示多参数值传递,**数字为key格式,后面的名字可以随意更改`#例1:defdisplay(**员工):print(employee)emp={'name':'Tom','age':22,'job':'dev'}display(name='Tom',age=22,job='dev')#Outputresult:{name:'Tom',age:22,job:'dev'}display(**emp)#Outputresult:{'job':'dev','name':'Tom','age':22}必须添加**unpack#示例2:deftest2(**kwargs):#形参格式为:**+形参名print(kwargs)#输出多个参数的字典数据类型#调用函数,只有关键字可以传值:test2(name="Tom",age=18,height=188.8)#输出字典数据类型:{"name":"Tom","age":18,"height":188.8}`总结:单个*表示值通过元组传递,实体传入为元组参数不定**符号表示使用字典传值,以字典形式传入的实参为不定5,普通参数和不定长参数混合`#例子:deftest3(a,b,*args):print("Outputaandb:",a,b)print("Outputvariablelengthparameters:",args)#调用函数:test3(1,2,3,4)#输出结果:Outputaandb:12output变长参数:(3,4)`六、lambda表达式(匿名函数)主要用来写简单的逻辑函数lambda表达式可以用来声明匿名函数,也就是smalltemporaryfunctionswithoutfunctionnameslambda是一种以表达式形式生成函数的方法,类似于用于创建函数的def语句。def常用于设计功能复杂的通用函数,而lambda则用于简单的函数以适应更灵活的应用,也称为function函数的简写。lambda定义的函数没有函数名,生成一个表达式形式的无名函数,表达式的结果就是lambda的返回值。必须先将lambda函数传递给变量,然后才能使用它。基本格式:`lambdaparameter1,...,parametern:functionbody#例子:add=lambdaa,b,c:a+b+cadd(1,2,3)#如果不需要参数f=lambda:pritn('hello')f()`例子:`defhello(name):prtin(name)defadd(x,y):returnx+yf=lambdaname:print(name)#相当于没有函数nameThehello()functionf2=lambdax,y:x+y#等价于add()functionf('Tom')没有函数名#outputresult:printoutTomprint(f2(5,3))#输出结果:8`7.函数委托(函数别名)`defadd(x,y):returnx+ya=add#将函数作为对象传递给变量时,注意不要加(),因为“函数名后+()”表示调用函数print(a(2,3))#委托函数的执行方式:a(),即a()等同于add()函数#输出结果:5defhello_chinese(name):print('Hello',name)hello=hello_chinesehello('Tom')hello=lambdaname:pritn('こんニチハ',name)hello('Tom')`*17八、使用函数作为参数另一个函数的rpass`#Example1defhello_chinese(name):print('Hello:',name)defhello_english(name):print('Hello',name)defhello_japanese(name):print('こんニちは',name)defhello(action,name):action(name)hello(hello_chinese,"Tom")hello(lambdaname:print('Прыв?танне!',name),"Tom")#Example2l=list(range(1,21))高清add(x):returnx+5#对列表l中的所有元素加5result=list(map(add,l))result=list(lambdax:x=5,l)`9.实际应用示例:实现选择用不同的语言打招呼`#defhello_chinese(name):#print('Hello:',name)#defhello_english(name):#print('Hello',name)#初级写法#whileTrue:#name=input("请输入姓名:n")#ifname=='stop':#break#language=input('请选择语言:nc=>中文版ne=>英文版nj=>日文版n')#iflanguage=='c':#hello_chinese(name)#eliflanguage=='e':#hello_english(name)#eliflanguage=='j':#(lambdaname:print('こんニちは',name))(name)#中间写#whileTrue:#name=input("请输入姓名:n")#ifname=='stop':#break#language=input('请选择语言:nc=>中文版ne=>英文版nj=>日文版n')##iflanguage=='c':#action=hello_chinese#eliflanguage=='e':#action=hello_english#eliflanguage=='j':#action=lambdaname:print('こんりちは',name)#action(name)#实现对应的选择不同语言的功能#大神别写法defhello_chinese(name):print('Hello:',name)defhello_english(name):print('Hello',name)defhello_japanese(name):print('こんニチハ',name)operation{'e':hello_english,'c':hello_chinese,'j':hello_japanese,'r':lambdaname:print('Прыв?танне!',name)}whileTrue:name=input("请输入姓名:n")ifname=='stop':breaklanguage=input('请选择语言:nc=>中文版ne=>英文版nj=>日文版nr=>俄文版n')#operation.get(language)(name)#如果没有找到当达到key值时,会返回None,相当于None(name),会报错。operation.get(language,hello_chinese)(name)#设置默认值为hello_chinese,防止出错。10、函数进阶工具1、map()函数的格式:`map(function,iterableobject)#map()返回的结果是一个map类型`*1*2map()函数,顾名思义,用于映射,将一个序列的每个元素映射到一个函数,然后返回一个迭代对象示例:`l=list(range(1,21))#生成从1到20的列表lresult=[]#将列表l中的所有偶数放入列表result#method1:useloopforninl:ifn%2==0:result.append(n)pritn(result)#方法二:使用推导(实际开发过程中建议使用推导)result=[xforxinlifx%2==0]pritn(result)#对列表l中的所有元素加5#方法一:使用loopforninl:result.append(n+5)pritn(result)#方法二:使用推导result=[x+5forxinl]#方法三:map()defadd(x):returnx+5result=list(map(add,l))#或者写成:result=list(map(lambdan:n+5,l))`2、filter()函数格式:`filter(function,iterableobject)`*1filter()函数,顾名思义,就是用来过滤的,将一个序列的每个元素映射到一个函数,并返回结果为True的元素。示例:l=list(range(1,11))defeven_number(x):returnx%2==0res=list(filter(even_number,l))#或者写成res=list(filter(lambdax:x%2==0,l))#只保留能被2整除的元素