Python中*args和**kwargs

一、概念

python中*args和**kwargs为魔法变量。args是arguments的缩写,表示位置参数;kwargs是keyword arguments的缩写,表示关键字参数。args和kwargs为编程人员约定的名字,可替换成其它字符串,只有前面的*才是必须的。当两个变量一起使用时,位置参数要放在关键字参数前面。

*args表示任何多个无名参数,可为0个,本质上是一个tuple。

**kwagrs表示任何多个键值对参数,可为0个,本质上是一个dict。

即*args是传递不定数量的tuple位置参数,**kwargs是传递不定数量的dict关键字参数。

def func(*args,**kwargs):
    print(args)
    print(type(args))
    print(kwargs)
    print(type(kwargs))

func(1,2,"hello","word",hello=1,word=2)

'''
(1, 2, 'hello', 'word')
<class 'tuple'>
{'hello': 1, 'word': 2}
<class 'dict'>
'''

二、应用

1、*args的用法

打包函数

将传递给函数的不定数量的参数打包成一个元组。

def func(x,y,*args):
    print("已知参数:x=%s,y=%s"%(x,y))
    print("不定长参数为:",args)
    for i in args: 
        print("不定长参数:",i)

func(1,2,3,4,"hello word!")

'''
已知参数:x=1,y=2
不定长参数为: (3, 4, 'hello word!')
不定长参数: 3
不定长参数: 4
不定长参数: hello word!
'''

 位置参数不在形参后面,需要在参数传入时,明确定义 *args后面的位置参数,否则会报错。

def func(x,*args,y):
    print("x=",x,"y=",y,"args=",args)

func(1,2,3,4,y=5)   #x= 1 y= 5 args= (2, 3, 4)
拆分参数

可以将一个列表或元组传递给一个函数,并使用*args来解包它们。这样,列表或元组中的元素将作为独立的参数传递给函数。

a=[1,2,3,4,5]
b=('a','b','c','d','e')
def func(x,y,*z):
    print("xy:",x,y)
    print("z:",z)

func(*a)
func(*b)

'''
xy: 1 2
z: (3, 4, 5)
xy: a b
z: ('c', 'd', 'e')
'''

2、**kwargs的用法

打包参数

将传递给函数的任意多个(也可以是零个)关键字参数打包成一个字典。

def func(x,y,**kwargs):
    print("xy=",x,y)
    print("kwargs=",kwargs)

func(1,2,hello=1,word=2)
'''
xy= 1 2
kwargs= {'hello': 1, 'word': 2}
'''
拆分参数

将传递给函数的字典拆分成独立的多个元素然后赋值给函数中的参数变量。
在拆分字典时,使用*拆分出来传给函数的只有键值(key),使用**拆分出来的是字典的每一项。

a={"hello":1,"word":2,"!":3}

def func(x,y,z):
    print("x y z:",x,y,z)

func(*a)    #x y z: hello word !

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

func(**a)   #kwargs: {'hello': 1, 'word': 2, '!': 3}

3、默认参数、位置参数和关键字参数的用法

函数的传递参数有多种是,参数顺序为:位置参数、默认参数、*args和**kwargs。

def func(a,b=1,*args,**kwargs):
    print(a,b,args,kwargs)

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

4、限制参数类型

定义函数时,参数中可以使用 /和 *来限制参数类型。

调用函数时,/前面只能是位置参数,*后面只能是关键字参数,不限制/和*之间的参数类型。

def func(x,/,y,z,*,k):
    print(x,y,z,k)

func(1,2,z=3,k=4)   #1 2 3 4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

武当豆豆

为国家GDP快速增长做贡献

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值