【Python】Python可变参数*args **kwargs

可变参数*args 和 **kwargs

作为函数定义时:收集未匹配参数组成tuple或dict对象

*参数也就是*args收集所有未匹配的位置参数组成一个tuple对象,局部变量args指向此tuple对象
**参数也就是**kwargs收集所有未匹配的关键字参数组成一个dict对象,局部变量kwargs指向此dict对象

def temp(*args,**kwargs):
	print(args) #() 如果不传入参数,则args是一个空的tuple	
	print(kwargs) #{} 如果不传入参数,则args是一个空的tuple	
    pass
def function(default = 1,*args,**kwargs):
    print(default)
    print(args)
    print(kwargs)
    print("function")

function("w",1,3,4,self = 2)

#w
#(1, 3, 4) 收集所有未匹配的位置参数
#{'self': 2} 收集所有关键字参数
#function

作为函数调用时:解包功能

*参数用于解包tuple对象的每个元素,作为一个一个的位置参数传入到函数中

my_tuple = ("w","y","z")
 
temp(*my_tuple)
#---等同于---#
temp("w","y","z")

**参数用于解包dict对象的每个元素,作为一个一个的关键字参数传入到函数中

my_dict = {"name":"wangyuanwai","age":32}
 
temp(**my_dict)
#----等同于----#
temp(name="wangyuanwai",age=32)

定义函数时候,参数*args在前,**kwargs在后,*args和**kwargs组合起来可以传入任意的参数。

Python函数 — 位置参数和关键字参数

*args例子

*args作为参数 定义函数 收集所有未匹配的参数,封存在一个list里

def print_str(first, *second):
    print(first)
    print(second)
# 定义一个函数,*second作为不定参数

此时我们只传入一个参数

print_str("hello")

输出会是

hello
()

传入的第一个字符串参数"hello"打印出来了,没有传入参数的*second则打印的是一个tuple对象的字符串表示形式,即一个括号"()" 。 注意:()表示含有0个元素的tuple对象!

函数调用时的 *args 进行解包

调用print_str()函数时,直接传入一个 *参数会发生什么?

def print_str(first, *second):
    print(first)
    print(second)
numbers_strings = ("1","2","3","4","5")
print_str(*numbers_strings)

输出结果为:

1
('2', '3', '4', '5')

*numbers_strings出现在函数调用时,称为解包(一个“*”字符后面紧挨着1个tuple对象),numbers_strings自身是一个tuple对象,所以也称为元组的解包,tuple中的元素解包成一个一个的位置参数传入到函数中,所以才有下面两个语句的相等性!

**kwargs例子

函数定义中,参数名称前有两个** 收集所有未匹配的参数,封存在一个字典里

在这里插入图片描述
定义一个函数,这里用到了*args 和 **kwargs

def printStr(first,second,*args,**kwargs):
    print(first)
    print(second)
    print(args)
    print(kwargs)

然后进行函数的调用,

printStr('first','second','third','fourth',fifth = '5')

输出结果为:

first
second
('third', 'fourth')
{'fifth': '5'}

kwargs字典收集了{‘fifth’: ‘5’}这个键值对。当然,在写函数的时候,如果需要取得这个’fifth’: ‘5’,使用字典的get()方法比较好。
在这里插入图片描述

函数调用时,传入的关键字参数有匹配的位置参数时,则位置参数优先使用(匹配)这些关键字参数,剩余所有未使用(未匹配)的关键字参数会在函数内组装进一个dict对象中,组装后dict对象会赋值给变量名anything,此时局部变量anything指向一个dict对象

注意:**参数只收集未匹配的关键字参数

函数调用时使用字典解包功能(dict对象前加**)

def printStr(first, **dict):
    print(str(first) + "\n")
    print(dict)

传入一个字典,用**进行解包

printDic = {"name": "tyson", "age":"99"}
printStr(100, **printDic)

相当于

printDic = {"name": "tyson", "age":"99"}
printStr(100, name = "tyson", age = "99") 

又一个例子

my_dict = {"name":"wang","age":32}
 
temp(**my_dict)
#----等同于----#
temp(name="wang",age=32)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值