Python之函数的收集参数和分配参数用法(‘*’ 和 ‘**’)

Python 专栏收录该内容
29 篇文章 0 订阅

前言

学过 C 或 C++的童鞋看到‘*’的第一反应就是“指针”,继而在学习 Python 的时候,也看到同样的星号,本以为对这家伙很熟悉,不过,真正了解 Python 中的"*"后才知道,这个 C 中的指针根本就是两码事。那么这里要总结的就是 Python 的星号的用法和含义,那就是收集参数和分配参数。

收集参数

什么叫收集参数呢?当我们在定义一个函数的时候,假如需要传入的参数个数是不定的,按照一般的写法可能需要定义很多个相同的函数然后指定不同的参数个数,这显然是很麻烦的,不能根本解决问题。

为解决这个问题,Python 就推出了收集参数的概念。所谓的收集参数,就是说只指定一个参数,然后允许调用函数时传入任意数量的参数。函数定义如下:

>>> def fun(*param)

在函数定义中可以看到,函数中定义的参数名前面多了一个星号(*),而就是这个星号起了作用。
参数前面的星号将提供的所有值都放在一个元组中,也就是将这些值都收集起来。

>>> def print_params(*params):
...     print(params)
... 
>>> print_params('hello')
('hello',)
>>> print_params(1,2,3)
(1, 2, 3)
>>> print_params()
()
>>> def print_params(title,*params):
...     print(title)
...     print(params)
... 
>>> print_params('hello',1,2,3)
hello
(1, 2, 3)

因此星号意味着收集余下的位置参数,如果没有提供可收集的参数,params 将会是一个空元组。

与赋值一样,带星号的参数也可以放在其他位置(而不是最后),但不同的是,在这种情况下需要做些额外的工作:使用关键字来指定后续参数
示例如下:

>>> def fun(x,*y,z):
...     print(x,y,z)
... 
>>> fun(1,2,3,4,5,z=6)
1 (2, 3, 4, 5) 6
>>> fun(1,2,3,4,5,6)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: fun() missing 1 required keyword-only argument: 'z'

上面示例可以看到,当带星号的参数放在中间位置时,后面的参数在传入时必须指定参数名,否则将会报错。星号不会收集关键字参数。

那么,上面提到星号不会收集关键字参数,那么,如果要手机关键字参数怎么办呢,这时候两个“星星”(**)就派上用场了。
Python 总是那么体贴,什么情况都能考虑到。

接下来通过示例看看Python中的函数如何用**来收集关键字参数的。

>>> def fun(**params):
...     print(params)
... 
>>> fun(x=1,y=2,z=3)
{'x': 1, 'y': 2, 'z': 3}

通过上述示例可以看到,打印出来的值是一个字典而不是元组。

所以简单的总结下:
Python 中函数参数带*的话,将会收集非关键字的参数到一个元组中;
Python 中函数参数带**的话,将会手机关键字参数到一个字典中;

下面结合使用这些技术来看个示例:

>>> def fun(x,y,z=3,*pospar,**keypar):
...     print(x,y,z)
...     print(pospar)
...     print(keypar)
... 
>>> fun(1,2,3,4,5,6,a = 11,b = 12,c = 13)
1 2 3
(4, 5, 6)
{'a': 11, 'b': 12, 'c': 13}
>>> fun(1,2)
1 2 3
()
{}

分配参数

前面说到收集参数,那么,和收集参数对应的相反操作就是分配参数,而分配参数同样可以用* 和**来实现。通过示例来看看分配参数如何运作的。
加入有如下函数:

>>> def add(x,y):
...     return x+y

同时假设有一个元组,其中包含需要相加的两个数

>>> param = (1,2)

这与前面的操作差不多是相反的,不是收集参数,而是分配参数,在调用函数是使用*实现:

>>> add(*param)
3

上述是将一个元组分配给函数参数使用,这种做法也已用于参数列表的一部分,条件是这部分位于参数列表末尾。同样的,可以使用**将字典中值分配给关键字参数。

>>> def fun(name,greeting):
...     print(greeting,name)
>>> param = {'name' :'jack','greeting':'well met'}
>>> fun(**param)
well met jack

OK,上述就是关于 Python 中收集参数和分配参数的用法,只有在定义函数(允许可变量的参数)或调用函数时(拆分自己或序列)使用,星号才能发挥作用。

  • 15
    点赞
  • 0
    评论
  • 18
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值