咱们在昨天的文章中(零基础学习 Python 之函数)所写的函数,它们的参数的个数都是肯定的,咱们知道世界是不肯定的,那么函数的参数固然也有不固定的时候,那么当咱们碰到这个问题的时候,该怎么解决呢?请看接下来的文章。python
若是你以前学过 C 或者 C++,看到星号的第一反应可能会认为这个与指针相关,而后就开始方了,其实放宽心,Python 中是没有指针这个概念的。bash
在 Python 中咱们使用星号收集位置参数,请看下面的例子:函数
>>> def fun(x,*args):
... print(x)
... res = x
... print(args)
... for i in args:
... res += i
... return res
...
>>> print(fun(1,2,3,4,5,6))
复制代码
上述例子中,函数的参数有两个,可是咱们在输出的时候赋给函数的参数个数不单单是两个,让咱们来运行这个代码,获得以下的结果:post
1
(2, 3, 4, 5, 6)
21
复制代码
从上面咱们能够看出,参数 x 获得的值是 1,参数 args 获得的是一个元组 (2,3,4,5,6) ,由此咱们能够得出,若是输入的参数个数不肯定,其它的参数所有经过 *args 以元组的方式由 arg 收集起来。学习
为了更能明显的看出 *args,咱们下面用一个简单的函数来表示:ui
>>> def print_args(*args):
... print(args)
...
复制代码
接下来我传入不一样的值,经过参数 *args 获得的结果咱们来看一下:spa
>>> print_args(1,2,3)
(1, 2, 3)
>>> print_args('abc','def','ghi')
('abc', 'def', 'ghi')
>>> print_args('abc',['a','b','c'],1,2,3)
('abc', ['a', 'b', 'c'], 1, 2, 3)
复制代码
无论是什么,均可以一股脑的塞进元组里,即便只有一个值,也是用元组收集,因此还记得在元组里一个元素的时候的形式吗?元组中若是只有一个元素,该元素的后面要有一个逗号。指针
那么若是不给 *args 传值呢?code
>>> def print_args(*args):
... print(args)
...
>>> print_args()
()
复制代码
答案就是这时候 *args 收集到的是一个空的元组。cdn
最后提醒一点的是,当使用星号的时候,不必定要把元组参数命名为 args,但这个是 Python 中的一个常见作法。
使用两个星号是收集关键字参数,能够将参数收集到一个字典中,参数的名字是字典的 “键”,对应的参数的值是字典的 “值”。请看下面的例子:
>>> def print_kwargs(**kwargs):
... print(kwargs)
...
>>> print_kwargs(a = 'lee',b = 'sir',c = 'man')
{'a': 'lee', 'b': 'sir', 'c': 'man'}
复制代码
由例子能够看出,在函数内部,kwargs 是一个字典。
看到这的时候,可能聪明的你会想,参数不是具备不肯定型吗?如何知道参数到底会用什么样的方式传值?其实这个很好办,把 *args 和 **kwargs 综合起来就行了啊,请看下面的操做:
>>> def print_all(x,y,*args,**kwargs):
... print(x)
... print(y)
... print(args)
... print(kwargs)
...
>>> print_all('lee',1234)
lee
1234
()
{}
>>> print_all('lee',1,2,3,4,5)
lee
1
(2, 3, 4, 5)
{}
>>> print_all('lee',1,2,3,4,5,like = 'python')
lee
1
(2, 3, 4, 5)
{'like': 'python'}
复制代码
如此这般,咱们就能够应对各类各样奇葩无聊的参数请求了。固然在这仍是要说的是,这里的关键字参数命名不必定要是 kwargs,但这个是一般作法。
更多内容,欢迎关注公众号「Python空间」,期待和你的交流。