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

Python函数学习总结

时间:2023-03-26 16:45:53 Python

1函数创建与调用1.1函数创建创建函数就是定义一个函数使用关键字def来实现语法:deffname([pname]):["comm"][fuc]说明:def:definitionFunction,固定写法fname:函数名pname:参数,可选,指定传入函数的参数,如果有多个,用逗号分隔参数comm:可选,函数的注释,即,解释函数Functions,传递参数,提高代码可读性fuc:函数体,可选,具体函数功能,如果有返回值,使用return()comm,fuc必须缩进显示如果要定义空函数,该函数可以直接使用pass作为占位符#-*-coding:utf-8-*-importrandomdefmgame(num):"""模拟剪刀石头布游戏::paramnum:输入一个介于0之间的值-2任意整数(0:石头,1:剪刀,2:布):return:返回输入num和计算机随机给定的值"""computernum=random.randint(0,2)ifnum==computernum:print("Tie!")elifnum==0andcomputernum==1ornum==1andcomputernum==2ornum==2andcomputernum==0:print("Iwon!")else:print("Thecomputerwon")returnnum,computernum结果:D:\Python37\python.exeF:/python_study/main.py进程已经结束,exitcode0运行上面的代码,没有任何显示,也没有抛出异常,因为函数没有被调用!!!1.2函数调用函数调用就是执行一个函数。简单理解:函数是实现某种功能或目的的工具,调用函数就是使用这个工具语法:fname([pname])说明:fname:函数名panme:参数,根据函数的定义,判断传入参数的类型以及是否传入参数#-*-coding:utf-8-*-importrandomdefmgame(num):"""模拟一个rock-paper-scissorsgame::paramnum:输入一个0-2之间的任意整数(0:rock,1:scissors,2:cloth):return:返回输入的num和计算机随机给定的值"""computernum=random.randint(0,2)ifnum==computernum:print("Tie!")elifnum==0andcomputernum==1ornum==1andcomputernum==2ornum==2andcomputernum==0:print("Iwon!")else:print("Thecomputerwon")returnnum,computernumout=mgame(2)#调用函数,因为这个函数定义了一个返回值,所以调用完函数,并给出结果输出变量;因为函数定义的时候有一个参数num,所以在调用的时候给了一个传入的参数2print(out)#使用变量out的值结果:#每次的结果可能都不一样,因为计算机随机给值,我这里跑了好几次,取了几个结果如下:电脑赢了(2,1),我赢了!(2,0)画!(2,2)1.3passemptystatementpass语句是指一个空语句,什么都不做,一般起到占位符的作用。如何使用它?比如我们写一个函数,我们暂时还不能确定它的功能。我们可以用pass来填,等我告诉别人的时候再补上。哈哈deffname():pass在python中可以用三个连续的点代替。deffname():...2参数传递比如【1.2函数调用】中的函数pname是一个参数,但是还有两个参数:实际参数(actualparameters)和formalparameters(形式参数)2.1怎么样形式参数和实际参数了解两者的区别吗?通过函数理解①由他们两个的函数决定。在书里是这么说的》定义函数时,函数名后面括号里的参数是[formalparameters],称为形式参数;......②说实话,最后一句我真的没看懂!!!③例如:#定义创建函数时,这里的num为形参deftest(num):print(num)#调用函数,此时函数参数5,(11,22,3344)是实参test(5)test((11,22,33,44))result:5(11,22,33,44)④根据实参类型的不同,实参的传递可以是分为【值传递】和【引用传递】,这里当然是实参传递给形参了,这两个概念怎么区分呢?B.当实参为变量对象时,按引用传递;C.本质区别是:传值后,传值形参不会改变,实参参数的值保持不变;传递引用后,形参的值改变了,实参的值也改变了******************************************************。不过,目前还不清楚!******************************⑤又如:#-*-coding:utf-8-*-deftest(name):print("原值:",name)name+=name#调用函数print("=======1,startvaluetransfer======")mtr="We都有一个梦想,那就是明年赚个亿!”print("调用前:",mtr)test(mtr)print("调用后:",mtr)print("=======2,开始引用调用======")mlist=["10亿","20亿","30亿"]print("调用前:",mlist)test(mlist)print("调用后:",mlist)结果:=======1.开始价值转移======在打电话之前:我们都有一个梦想,那就是明年赚个亿!原值:我们都有一个梦想,那就是明年赚个亿!电话后:我们都有一个梦想,那就是明年赚个亿!=======2。开始按引用传递======调用前:['10亿','20亿','30亿']原值:['10亿','20亿','30亿']调用后:['10亿','20亿','30亿','10亿','20亿','3100,000,000']用一个比喻来理解,参数列表中的参数是形式参数,当定义函数,调用函数时传入的参数为实参,例如:脚本中的角色为形参,扮演角色的演员为Arguments。====这句话不是我说的,是课本上的!!2.2位置参数是强制参数,必须按照正确的顺序传递给函数,即调用的次数和位置必须与定义时相同。①数量必须和定义一致#-*-coding:utf-8-*-#也就是说调用函数时,指定的实参数量和形参数量要一致,否则会抛出异常被抛出TypeErrordeftest(num1,num2):sum=0sum=num1+num2print(sum)test(1,2)test(2)#这样会抛出异常,因为参数个数不一致Result:3Traceback(mostrecentcalllast):File"F:/python_study/main.py",line12,intest(2)TypeError:test()missing1requiredpositionalargument:'num2'②位置必须与definition#-*-coding:utf-8-*-#即调用函数时,指定的实参位置与形参位置一致,否则会抛异常TypeError或不抛异常,但是程序有个bugdefperson(name,age,height):print(name,age,height)person("XiaoZhang",18,170)#换个位置,if类型不同,虽然结果没有抛出异常,但是名字是18,年龄是小张,好像不合适,有个bugperson(18,"小张",170)结果:小张张1817018小张1702.3关键字参数是用形参的名称来确定输入参数值。这种方式指定实参时,不需要和形参的位置完全一致,只要把参数名写对就行了。#-*-coding:utf-8-*-defperson(name,age,height):print(name,age,height)person(height=170,name="小张",age=18)结果:小Zhang181702.4给参数设置默认值或定义函数时,直接不传入参数时直接使用指定形参的默认值使用默认值语法:deffname(pname=defaultname):[func]说明:fname:函数名pname:参数,可选defaultname:参数的默认值pnamefunc:函数体#-*-coding:utf-8-*-defperson(name="XiaoZhang"):print(name)person()#没有传参数,使用默认值person("XiaoLi")#传了参数,使用传入的值Result:XiaoZhangXiaoLiYoucan使用"functionname.__defaults__"查看函数默认值参数当前值,结果为元组#-*-coding:utf-8-*-defperson(name="小张",age=18,height=172):print(name)person()#没有传递参数,使用默认值person("小李")#传递了参数,使用传递的值print(person.__defaults__)#查看默认值函数参数Result:XiaozhangXiaozhang('xiaozhang',18,172)2.5可变参数,即变长参数,即传入函数中的实际参数可以是0、1、2或任意numberofvariableparameters有两种形式:parameter和*parameter①*parameter:表示接收任意数量的实参,放入一个元组#-*-coding:utf-8-*-defperson(*name):print(name)foriteminname:print(item)person("小张","小李","老王","邻居老王")#string直接写person(*["小张","小李","老王","隔壁老王"])#如果传入的可变参数是列表,则需要在列表前加*Results:('小张','小李','老王''邻家老王')小张小李老王隔壁老王('小张''小李''老王''邻居老王')小张小李老隔壁王老王②**参数:表示接收任意多次显示赋值实参并放入字典#-*-coding:utf-8-*-defperson(**name):print(name)forkey,valueinname.items():print(""+key+"英文名:",value)person(小张="xiaozhang",小丽="xiaoli",老王="laowang",隔壁老王="gblw")结果:{'小张':'小张','小李':'xiaoli','老王':'laowang','邻居老王':'gblw'}小张英文名:xiaozhang小李英文名Name:xiaoli老王英文名:LaowangNextdoorOldwang的英文名:gblw至此,感觉可以休息一下了之后,函数执行结束#-*-coding:utf-8-*-defname_to_xname(name):xname=""ifname=="小张":xname="小张"elifname=="老王":xname="老王"elifname=="老李":xname="老李"elifname=="隔壁老李":xname="gblw"else:print("输入的姓名不存在,请重试输入以下其中一项:",["小张","老王","老李","隔壁老王"])return(xname)whileTrue:name=input("请输入以下任一名称,请输入:")xname=name_to_xname(name)print("{}的英文名称:{}".format(name,xname))result:请输入以下任一姓名,请输入:小李输入的姓名不存在,请重新输入以下其中一项:['小张','老王','老李','邻居老王']小李的英文名:请输入以下任意一个,请输入:小张小张的英文名:xiaozhang请输入以下任意一个,请输入:老王老王的英文名:laowang请输入任意一个以下其中一个名字,请输入:老李老李的英文名字:laoli请输入以下任何一个名字,请输入:隔壁老王隔壁老王的英文名字:gblw4变量scope是程序代码可以所在的区域访问变量。根据变量的“作用范围”,变量分为局部变量和全局变量。4.1局部变量是函数内部定义和使用的变量,只在函数内部有效coding:utf-8-*-deflove():love_to_you="如果上帝再给我一次机会,我会喜欢那个...(这里省略一万字!)"print("Iamalocalvariable:",love_to_you)#打印这个局部变量love()print("这里打印会报错:",love_to_you)#如果打印这个函数外的局部变量,会报错结果:我是局部变量:如果上帝能再给我一次机会,我就在那儿碰碰运气……(此处省略一万字!)traceback(mostrecentcalllast):File"F:/python_study/main.py",line8,inprint("Printingherewillreportanerror:",love_to_you)#如果在外面打印这个局部变量函数,会报错NameError:name'love_to_you'isnotdefined4.2全局变量是函数内外都可以使用的变量。有两种情况:①变量在函数外定义,这个变量在函数外和函数内都可以访问,即定义在函数外的变量是一个全局变量在我面前,却不珍惜,如果..."love_recive="如果没有如果,那是你活该,如果现在就知道,当初何必如此!love_to="说实话忘记省略号后面的内容怎么说了,哈哈哈"deflove():print("我是全局变量1:",love_to_you)#打印所有变量deflove_add():love_to_you_add=love_to_you+love_reciveprint("我是全局变量2:",love_to_you_add)love()love_add()print("我是全局变量3:",love_to)结果:我是全局变量1:曾经有一个真心爱在眼前,我却没有珍惜,如果……我是全球变数2:曾经有一份真挚的爱在我面前,我却没有珍惜。如果……不,如果,你活该。如果你现在就知道,何必呢!!我是全局变量3:说实话忘记省略号后面的内容怎么说了哈哈哈在函数体中#-*-coding:utf-8-*-defspeak():globalspeak_to_allspeak_to_all="他的叔叔和二叔都是他的叔叔,"print("全局变量1:",speak_to_all)defspeaks():globalspeak_to_onespeak_to_one="高桌低板都是木头的"print("全局变量2:",speak_to_one)defspeakss():globalspeak_tospeak_to=speak_to_all+speak_to_onespeak()speaks()speakss()print("外部直接调用全局变量1:",speak_to_all)print("外部直接调用全局变量2:",speak_to_one)print("外部直接调用全局变量3:",speak_to)result:全局变量1:大叔和二叔都是他的叔叔,全局变量2:高桌和矮板都是木头的,直接对外调用全局变量1:大叔和二叔都是他的叔叔,外部直接调用全局变量2:高桌低板都是木头外部直接调用全局变量3:他舅舅和二舅都是他舅舅,高桌子低板都是wood5Anonymousfunctionmeansnoname当需要一个函数时使用函数,但是你不想给函数命名。这样的函数只会被使用一次。您可以使用lambda表达式创建匿名函数语法:result=lambda[arg1[,arg2,...,argn]]:exp描述:result:calllambdaexpression[arg1[,arg2,...,argn]]:可选参数,指定要传递的参数列表,多个参数用逗号分隔exp:必选参数,用于实现特定功能的表达式#-*-coding:utf-8-*-defnsum(a,b):sums=a+bprint(sums)deflsum(c,d):lsum=lambdac,d:(c+d)print(lsum(c,d))print("======常用方法计算两数之和======")nsum(100,200)print("======lambda计算两数之和======")lsum(100,200)result:======普通方法计算两数之和======300======lambda计算两数之和======3006常用的python内建函数python内置,可以直接调用使用python3.7中的69个内置函数,点此查看