Python基础知识之函数
这一篇没有酷炫的图,就是记录一些基础知识深化理解的记录。最近我决定再去小破站学习Python及其巫术,于是学着学着发现有必要继续学习一下一些基础知识,比如函数和类那些部分,第一遍学的时候云里雾里的,还是有些抽象的,还好现在可以通过很多渠道学习,需要的只是时间和一个带脑子的脑壳了。既然学,那么就继续学了。在我看来,重复对基础知识的学习是有必要的,同时搭配处理一些实际的训练解决专业方面的问题,也不要觉得基础知识无聊,乏味,看不懂,没办法,没有基础知识或者强化理解基础知识,就是抓瞎,加油吧,骚年们
函数这里还不算抽象,我也是看了哔哩哔哩的视频,然后才有了新的理解,于是就顺便把文档记录下来,都是一些简单的example,非常简单的例子,其中还还包含有一些报错,使用简单的例子来做测试并得到报错信息有时候也是很有参考价值的,比如这个,等等之类的,通过差异对比有助于更好的理解它们,所以基础才是根基呀,搞学习吧
TypeError:func()takes2positionalargumentbut3weregiven
记录了5个文档,内容也是从小破站视频里记录下来的,精简但不失关键的记录,可以做到连贯性的理解
模块化编程function,实现一定的功能函数定义:就是一个具有特定功能的代码块函数作用:把代码进行封装,以提高代码的重用性,提高开发效率降低后期的维护成本(时间和资金成本)函数的定义和使用:基本结构def函数名([参数列表]):当前函数具体功能的代码函数定义好之后并不会直接执行,如果要使用的话需要调用才能使用调用方式:函数名()deflove():print(i)print(love)print(you)#函数的特征和注意事项:定义后,不调用就不执行#必须在函数定义之后才能成功调用#不受调用次数的影响,可以调用N多次#函数命名要遵守命名规范:字母数字和下划线#不能以数字开头,严格区分大小写且不能使用关键字#命名最好有意义,且不使用中文#函数名不要冲突,否则会被覆盖#love()
学习函数的参数知识定义函数时,可以在参数列表位置指定形参如果有形参,那么在调用时候必须传递实参实参将值传递给形参的过程实质上就是变量的赋值操作#定义带有参数的函数#在定义函数时,在括号内可以定义形参(不是具体的值)deflove(w):print(filoveyou{w})在外面调用时候,需要传递参数,实参#love(小狗)如果定义了函数的形参,但是你又没有给,那么将会报错TypeError:func()missing1requiredpositionalargument:a理解这个报错信息#定义带有多个参数的函数deflove2(x,w):print(f{x}iloveyou{w})love2(小狗,人类)上面要求2个参数,但如果知只传递了一个参数进去的话则报错和上一个一样,提示缺少一个必须的positionalargument函数要求传递几个参数,那么就只能传递几个参数假设函数只是要求传递2个参数,而多传递一个参数的话则也会报错,TypeError:func()takes2positionalargumentbut3weregiven翻译过来就是说要求2个,你却传了3个参数函数定义了几个,就必须指定按顺序进行参数的传递
#函数中的参数类型#普通参数,默认参数,收集参数,命名关键字参数,关键字参数收集#普通参数也叫位置参数,也叫顺序参数,也是必须传递的参数deffunc(x,y):print(x,y)#func(1,2)#比如要求有3个参数,分别是x,y,i,至少传递2个#那么这时候最后一个参数就是默认参数#但是对于默认参数,需要在定义形参时,指定默认值#默认参数必须放在普通参数之后deffunc2(x,y,i=):print(x,y,i)#func2(1,2,3)#调用的时候,依然成功,使用的是传递的实参#如果没有给默认参数传递值,那么就使用默认值#你给我,我就用,不给的话,我就用自己的默认值#收集参数,作用是收集多余的参数#即定义一个形参收集多余的实参,或者理解为不确定传递多少个实参#在定义函数时,如果需要设置收集参数,那么这个形参需要在其前面加一个*号#接收到的多余的参数会保存在args中,以元组形式保存deffunc3(x=+,*args):ifx==+:print(加法运算,args)else:print(减法运算,args)#func3(+,,,0)普通参数,默认参数,收集参数*args命名关键字参数命名关键字参数:deflove(a,b,c,*args,name):print(a,b,c)print(args)print(name)love(1,2,4,5,6,7,8,9,name=aaa)#通过调用love函数,1,2,3分别传递给abc,5-传递给了收集参数args#这里的name就叫命名关键字参数,由于在定义函数的时候指定了name#因此在调用函数的时候需要指定name这个命名关键字参数#如果不指定name=什么的话,那么会报错,love(1,2,4,5,6,7,8,9,aaa)#TypeError:love()missing1requiredkeyword-onlyargument:name#关键字参数定义在收集参数后面,*args后面#关键字参数必须通过形参的名字传递,比如name=xxx#普通函数在调用时,需要按照顺序进行参数传递#也可以把普通函数的普通参数按照关键字参数进行传递#遮掩的话就可以不要求顺序传递了参数的order顺序:普通-默认-收集参数*args-关键字参数-关键字收集参数**kwargs一般不会5种形参参数同时出现一般推荐使用:普通参数+收集+关键字收集参数#######################
#def完成购功能+返回值把返回值返回到调用出也可以用变量接收return意味着函数的结束,之后的内容不再执行#分类#1.执行过程函数#2.具有返回值的函数#没有返回值的是None,或者return后面没有内容,就是None#返回值一般配合变量赋值操作returnres,r=func()
变量的作用域是当前起作用,可用的范围区域或者说有效范围num=10deffunc():print(num)#func()#函数内可以获取函数外的变量,但是不可操作#第二种情况是函数内定义的变量,不能获取,也不能操作#例如deffunc():num=20num+=1print(num)#变量分两种:可变与不可变类型#可变类型:函数外定义的变量,在函数内可以访问和操作,比如列表和字典#不可变类型:#函数内部定义的变量是局部变量,但可以用global关键字定义为全局变量#函数也有作用域defouter():print(thisisouterfunction...)#在外层函数内部再定义一个inner()函数#但是只能调用到outer函数,而调用不到inner函数#类似于一个局部变量,成为局部函数definner():print(thisisinnerfunction...)#想要在调用局部函数的话,需要在内部调用一次inner()outer()#调用测试两个函数#outer()正常#inner()报错,提示NameError:nameinnerisnotdefined#outer()#这个位置的调用是在在调用局部函数inner基础上的#因此这时候可以调用外+内的函数#另一种情况:在外层定义的函数中,设置一个变量#可以在内层函数中访问和修改吗?defouter():print(thisisouterfunction...)abc=10#在外层函数内部再定义一个inner()函数#但是只能调用到outer函数,而调用不到inner函数#类似于一个局部变量,成为局部函数definner():print(thisisinnerfunction...)abc+=1#想要在调用局部函数的话,需要在内部调用一次inner()outer()#比如这里的abc变量,首先是定义在外层函数中的#很显然的是内层函数这时候即使调用了,也获取不到#原因在于:abc这个变量定义在外层函数内,但是相对于内层函数来说就是局部变量了#因为abc在inner函数的外部,相当于一个全局变量##################nonolocal关键字#在内函数中如何使用外层变量defouter():num=10definner():#nonlocalnumnum+=1print(num)inner()outer()#num=10为外函数定义的局部变量,那么内函数inner可以访问和操作吗#答案是可访问,但是暂时不可操作#那么有方法可以做到既访问又操作吗?#num+=1就是操作,但是暂时不行,会报错#UnboundLocalError:localvariablenumreferencedbeforeassignment#赋值前引用的局部变量,如果inner要使用的话,那么需要先引用num这个局部变量#这个时候就不能用global关键字--invalidsyntax#如果你用globalnum的话报错说num不存在,因为它是一个局部变量#如果将num在函数外再定义一次的话可以#在局部函数中访问+操作外层函数定义的局部变量,解决办法是在内函数中使用#nonlocal关键字###总结:在内函数中如果想使用外层函数的变量,那么需要使用nonlocal关键字#__name__,这类是魔术变量,没有定义就已经有了#当前脚本如果作为主程序,那么值是__main__#主程序指的就是脚本写好之后,直接用Python解释器运行的这个脚本#如果是当做一个模块在另外一个脚本中引用去使用#那么值就是当前模块的名字#__doc__是当前函数的文档说明#可以看到函数的一些README的信息,三行注释信息内容#print(__doc__)#一开始的三引号deffunc():#这个位置编写当前函数的使用介绍,文档说明#说明当前函数的功能作用#:return:
在我看来,重复对基础知识的学习是有必要的,同时搭配处理一些实际的训练解决专业方面的问题,也不要觉得基础知识无聊,乏味,看不懂,没办法,没有基础知识或者强化理解基础知识,就是抓瞎,加油吧,骚年们
INUYASHA
转载请注明:http://www.sonphie.com/lcbx/14368.html