最近,在学习python,天天抱着廖雪峰的教材苦练,https://www.liaoxuefeng.com/
但廖老毕竟是如此的才华盈溢,我这等小辈真是读起来教程都有些费力。
关于python-函数中的参数类型和可变参数解析这一章,觉得不 是太清晰,又找了园子里又一位仁兄:http://www.cnblogs.com/tqsummer/ ,感激涕零,他写的真是浅显易懂
1、函数的定义:
def funca(): pass
funca没有参数,同时啥也不干
2、位置参数:
>>> def funcb(x): print(x * x) >>> funcb(2) 4
>>> def funcc(a,b): print(a) print(b) >>> funcc(2,3) 2 3
很明显,我们需要使用函数名,加上圆括号的参数列表,参数顺序和个数要和函数中定义的一致,
>>> def funcc(a,b): print(a) print(b) >>> funcc(2,3) 2 3 >>> funcc(4) Traceback (most recent call last): File "<pyshell#144>", line 1, in <module> funcc(4) TypeError: funcc() missing 1 required positional argument: 'b'
以上的函数定义,都是在预选定义这个函数需要多少个参数的情况下使用,一般是没有问题的
3、默认参数
先来看一个例子:
>>> def funce(a,b): print(a) print(b) >>> funce(5) Traceback (most recent call last): File "<pyshell#157>", line 1, in <module> funce(5) TypeError: funce() missing 1 required positional argument: 'b'
funce(a,b)函数定义的没有问题,但是我的调用代码失败了,原因是我方法中新增了一个形参,但调用的时候少调用了一个参数,这个时候
默认参数就能用了
>>> def funce(a,b=5): print(a) print(b) >>> funce(6) 6 5
到这为止,固定参数已讲完,下面开始讲解可变参数,就是*(一颗星)与**(2颗星的差异)
4、可变参数(*a)
有些时候固定参数没办法满足我们的需求,我们需要使用*a来定义可变参数
>>> def funcd(a,b,*c): print(a) print(b) print("length of c is :%d "% len(c)) print(c) >>> funcd(1,2,3,4,5,6,7) 1 2 length of c is :5 (3, 4, 5, 6, 7)
我们看到,前面1,2被a,b参数接收了,剩下的5个参数值,全部被c接收,以在这里是一个tuple(元组)
我们在调用funcd的时候,至少要传2个参数值,大于2个以上的参数值是存在c这个tuple中,如果只有2个值,那么c就是一个empty tuple
tuple和list非常类似,但是tuple一旦初始化就不能修改。tuple是用小括号表示的
5、可变参数(**)
上面的例子,调用函数的时候,传递的参数都是根据位置来跟函数定义里的参数表匹配的,在python中,还支持一种用关键字参数(keyword,argument)调用函数的方法,也就是在调用函数的时候,明确指定参数值付给哪个形参,比如还是上面的例子
>>> def funcf(a,b): print(a) print(b) >>> funcf(b=3,a=5) 5 3
结果是一样的,还是按参数名称的顺序来显示值
在函数调用中,可以混合使用基于位置匹配的参数 和关键字参数,前提必须是先给固定位置的参数
>>> def funcf(a,b): print(a) print(b) >>> funcf(b=3,a=5) 5 3 >>> funcf(5,3) 5 3
结果是一样的
好了,2颗星的终于可以上来了
如果一个函数中定义的最后一个形参有**(双星)前缀,所有正常形参之外的其它的关键字参数都将被放置在一个字典(dict)中传递给函数,例如:
>>> def funcj(a,**b): print(a) for x in b: print (x + ":" + str(b[x])) >>> funcj(200,b=500,d='aaa',c='xxx') 200 b:500 d:aaa c:xxx
首先b是一个字典,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度
调用funcj的时候,除了第一个参数值a是200外,其它bdc都是b这个dict实例的参数值了
>>> funcj(200,400,500,'aaa') Traceback (most recent call last): File "<pyshell#175>", line 1, in <module> funcj(200,400,500,'aaa') TypeError: funcj() takes 1 positional argument but 4 were given
这样调用显然是不行的,必须指定参数才可以。因为它是可变参数,没有固定形参来匹配,所以调用时候必须指定参数
道理都懂了,主要是用的时候看如何灵活运用即可。