python的*args和**kwargs

在py中,函数的参数传递非常重要,它决定了函数的返回值怎么输出。python比较特殊,它的函数参数不仅可以有固定长度的,还可以有不定长度的。*args和**kwargs就是表示传参是不定长度的。

一、*args和**kwargs是什么?

  • *args, **kwargs都是python的可变参数。
  • *args可以用来表示任何多个无名参数,本质上是tuple类型
  • **kwargs可以用来表示关键字参数,本质上是dict类型
def func1(*args,**kwargs):
	print(type(args))
	print(args)
	print(type(kwargs))
	print(kwargs)
func1(1,2,'hello world',a=4,b=6,c='oo',d=[])

输出:
<class 'tuple'>
(1, 2, 'hello world')
<class 'dict'>
{'a': 4, 'b': 6, 'c': 'oo', 'd': []}
  •   *args和 **kwargs 重要是前面的*,你也可以写 *var和**vars,而写成 *args和 **kwargs 只是程序员通俗写法 
  • def func1(*var,**var2):
    	print(type(var))
    	print(var)
    	print(type(vars))
    	print(vars)
    func1(1,2,'hello world',a=4,b=6,c='oo',d=[])
    
    运行结果跟上面的使用*args和 **kwargs的一致。 
  • *args参数必须在**kwargs前面,因为位置参数必须在关键词参数前面。
def func1(**kwargs,*args):
	print(type(args))
	print(args)
	print(type(kwargs))
	print(kwargs)
func1(a=4,b=6,c='oo',d=[],1,2,'hello world')

 

二、*args的用法

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

举例1:将非键值的可变数量的参数列表传递给一个函数。

def func1(*args):
	for i in args:
		print("arg throuth args:{}".format(i))
func1(1,2,3,4)

输出:
arg through args:1
arg through args:2
arg through args:3
arg through args:4

举例2:函数接受实参时,按顺序分配给函数形参,如果遇到带*的形参,那么就把还未分配出去的实参以元组形式打包(pack), 分配给那个带*的形参。

def func1(x,*args):
	print("a:{}".format(x))
	print("number:{}".format(args))
	print(type(args))
func1(1,2,3,4,5)

输出:
a:1
num:(2, 3, 4, 5)
<class 'tuple'>

从例子中可以看出,*args接受了实参(2,3,4,5), 第一个参数1被形参x接受走了。

举例3:如果把*args放在位置参数前面,需要将在参数传入时,明确定义 *args后面的位置参数定义,否则会报错

把*args放在前面

def func(*args, x, y):
    print('a:{}'.format(x))
    print('b:{}'.format(y))
    print('num:{}'.format(args))
    print(type(args))

func(1,2,3,x=4,y=5)
输出:
a:4
b:5
num:(1, 2, 3)
<class 'tuple'>
    

把 *args放在中间

def func1(x,*args,y):
	print("a:{}".format(x))
	print("b:{}".format(y))
	print("number:{}".format(args))
	print(type(args))

func1(1,2,3,4,y=5)
输出:
a:1
b:5
number:(2, 3, 4)
<class 'tuple'>

拆分参数:调用一个函数

*args是把打包了的参数拆成单个的,依次赋值给函数的形参。

举例:

def func1(arg1,arg2,arg3):
	print(arg1,'\n',arg2,'\n',arg3)
args=[1,2,3]
func1(*args)

输出:
1 
 2 
 3

三、**kwargs的用法

打包参数:将不定数量的参数传递给一个函数

**kwargs可以用来发送不定长度的键值对的字典参数给一个函数

举例:

def func1(**kwargs):
	for key,value in kwargs.items():
		print("{0}=={1}".format(key,value))
func1(a=4,b=6,c='oo',d=[])

输出:
a==4
b==6
c==oo
d==[]

拆分参数:调用一个函数 **kwargs是把字典的键值拆成单个的,依次赋值给函数的形参。

举例:

def func1(arg1,arg2,arg3):
	print(arg1,'\n',arg2,'\n',arg3)

kwargs={'arg1':1,'arg2':2,'arg3':3}
func1(**kwargs)

输出:
1 
 2 
 3

四、位置参数、*args, **kwargs的组合使用

位置参数、*args、**kwargs 三者的顺序 必须是: 位置参数、*args、**kwargs

举例:

def func1(x,*args,**kwargs):
	print(x)
	print(args)
	print(kwargs)
func1(1,2,3,4,a='hh',b='worl',c='soda')

输出:
1
(2, 3, 4)
{'a': 'hh', 'b': 'worl', 'c': 'soda'}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值