Python | *args和**kwargs是什么?怎么用?

发布时间 2023-06-11 17:39:57作者: 张Zong在修行

在python语言写成的模块中的函数里,常常可以看到函数的参数表列里面有这两个参数,形如:

def some_function(*args, **kwargs):
    to do list
    return ...

*args**kwargs是什么?

首先,解释星号的作用,一个星号*的作用是将tuple或者list中的元素进行unpack,作为多个参数分开传入;两个星号**的作用是把dict类型的数据作为参数传入。

*args用于传递任意数量的位置参数,其实际上会将这些参数打包成一个元组(tuple)传递给函数。这个元组的名字可以是任意的,但通常使用args来表示。例如:

def foo(*args):
    for arg in args:
        print(arg)
        
foo(1, 2, 3, 4)  # 输出:1 2 3 4

**kwargs用于传递任意数量的关键字参数,其实际上会将这些参数打包成一个字典(dict)传递给函数。这个字典的名字可以是任意的,但通常使用kwargs来表示。例如:

def bar(**kwargs):
    for key, value in kwargs.items():
        print(key, value)
        
bar(a=1, b=2, c=3)  # 输出:a 1   b 2   c 3

实际并不必须写成 *args**kwargs(这样写只是一个约定而已)。只有变量前面的 *(星号) 才是关键。当然我们可以写成 *var**vars, 但是不建议修改。

kwargs是keyword argument的缩写,args就是argument。我们知道,在Python中有两种参数,一种叫位置参数(positional argument),一种叫关键词参数(keyword argument),关键词参数只需要用 keyword = somekey 的方法即可传参,而位置参数只能由参数位置决定。这也就决定了位置参数一定要在前面,否则关键词参数数量的变化(比如有些kwargs有默认值因此没有传参或者在后面传参的),都会使得位置无法判断。因此常见的也是*args**kwargs 前面。

两者区别

  • *args 接收多余的位置参数, 以元组的形式显示
  • **kwargs 接收多余的关键字参数, 以字典的形式显示
  • 并且同时使用 *args**kwargs 时, *args 参数必须放在 **kwargs

*args的使用

你可以将不定数量的参数传递给一个函数。

def test(t_arg,*args):
	print("first arg:",t_arg)
	for arg in args:
		print("another arg through *args:",arg)
test('python','java','php','c++')

# 输出结果
"""
first arg: python
another arg through *args: java
another arg through *args: php
another arg through *args: c++
"""

**kwargs的使用

**kwargs 允许将不定长度的键值对, 作为参数传递给一个函数。如果想要在一个函数里处理带名字的参数, 应该使用 **kwargs

def test2(**kwargs):
    for key, value in kwargs.items():
        print(f'{key} == {value}')
test2(name='张三')
# name == 张三	

*args**kwargs 同时使用

在一个函数中,*args**kwargs可以同时使用,但是*args必须出现在**kwargs之前。例如:

def foobar(*args, **kwargs):
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(key, value)
        
foobar(1, 2, 3, a=4, b=5)  # 输出:1 2 3   a 4   b 5

**kwargs 遍历

方法一(推荐):

def test_kwargs(**kwargs):
    for key,value in kwargs.items():
        print("{} is {}.".format(key,value))
123

方法二:

def fxn(a1, **kwargs):
    print a1
    for k in kwargs:
        print k, " : ", kwargs[k]