您当前的位置: 首页 >  Python

RuiH.AI

暂无认证

  • 5浏览

    0关注

    268博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Python 函数参数列表中,*与**的意义

RuiH.AI 发布时间:2022-04-09 13:22:35 ,浏览量:5

Python 函数参数列表中,*与**的意义
  • 前言
  • 起因
  • python函数定义
    • 普通的参数列表
    • 默认参数
  • 参数列表中的`*args, **kwargs`
    • 列表只有`*args`
    • 列表只有`**kwargs`
    • 列表中有`arg, *args, **kwargs`
  • 函数调用中的**与*

前言

本篇记录一下python函数的参数列表中,***的意义

起因

python最强大的特性之一,就是琳琅满目的第三方库以及pip install xxx超简单的安装包方法。

但是有的第三方库,提供的函数方法非常的“简洁”,比如matplotlib包中,绝大部分函数的参数列表是**kwargs,让人非常疑惑。

于是就有了本篇文章的内容:参数列表中的**kwargs是啥?

python函数定义 普通的参数列表

首先从最简单的python函数定义开始,普通的参数列表长这样:

def func(a, b, c):
	print(a, b, c)
	
func(1, 2, 4)
# 1 2 4

也就是说,传参顺序按照函数的参数列表顺序a, b, c

此外,可以指定传参时的接收参数:

def func(a, b, c):
	print(a, b, c)
	
func(b=1, a=2, c=4)
# 2 1 4

还可以混合传参,不过混合传参时,带参数名的参数必须放在不带参数名的右边:

def func(a, b, c):
	print(a, b, c)
	
func(1, c=2, b=4)
# 1 4 2
默认参数

函数的参数列表可以带默认参数,默认参数必须放在参数列表右边:

def func(a, b=2, c=4):
	print(a, b, c)
	
func(1)
# 1 2 4
func(1, 3)
# 1 3 4
func(1, c=3)
# 1 2 3
参数列表中的*args, **kwargs 列表只有*args

考虑最简单的情况:

def func(*args):
	print(args)

func(1, 2, 3)
# (1, 2, 3)

*args传递了三个值1, 2, 3args得到的是(1, 2, 3)这个元组。也就是说,函数参数列表中的*args表示args根据接收到的传参形成元组。

列表只有**kwargs

考虑最简单的情况:

def func(**kwargs):
	print(kwargs)

func(a=1, b=2, c=3)
# {'a': 1, 'b': 2, 'c': 3}

**kwargs传递了a=1, b=2, c=3三个带参数名的值,kwargs得到的是{'a': 1, 'b': 2, 'c': 3}这个字典。也就是说,函数列表中的**kwargs根据接收到的带参数名的传参形成字典。

实际上这个kwargs中的kw指的就是keyword(也可以把kwargs换成其它的名字)

列表中有arg, *args, **kwargs

最后就是比较复杂的情况了,参数列表中同时有普通参数,带*, **的参数:

def func(arg1, arg2, *args, **kwargs):
	print(arg1, arg2, args, kwargs)

func(1, 2, 3, 4, a=5, b=6)
# 1 2 (3, 4) {'a': 5, 'b': 6}

可以看出程序运行时,先向普通参数arg1, arg2传值1, 2,再把不带参数名的传参值3, 4*args传递,得到args=(3, 4),最后把带参数名的传参值a=5, b=6**kwargs传递,得到kwargs={'a': 5, 'b': 6}

函数调用中的**与*

除了函数定义时参数列表中使用*args**kwargs,还可以在调用时使用***解包参数,解包逻辑与函数定义是相同的:

def func(a, b, c):
	print(a, b, c)

args = (1, 2, 3)
func(*args)
# 1 2 3
def func(a, b, c):
	print(a, b, c)

kwargs = {'a': 1, 'b': 2, 'c': 3}
func(**kwargs)
# 1 2 3
关注
打赏
1658390299
查看更多评论
立即登录/注册

微信扫码登录

0.1801s