在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]
标签:Python,kwargs,args,参数,key,arg,print
From: https://www.cnblogs.com/zhangxuegold/p/17473267.html