详解Python 中的 *args 和 **kwargs的用法
在本文中,我们将介绍 **(双星/星号)和 *(星号/星号)对 Python
中的参数有什么作用,在这里,我们还将介绍 Python
中的 args
和 kwargs
示例。我们可以使用特殊符号将可变数量的参数传递给函数。
有两个特殊符号:
用于在 Python 中传递参数的特殊符号:
*args
(非关键字参数)**kwargs
(关键字参数)
"当我们对函数中应该传递的参数数量有疑问时,我们使用这样的"通配符"或" "符号------ args 或 **kwargs------作为函数的参数。"
什么是 Python *args?
Python
函数定义中的特殊语法 *args 用于将可变数量的参数传递给函数。它用于传递非关键字、可变长度的参数列表。
语法是使用符号 * 来接收可变数量的参数;按照惯例,它通常与单词 args 一起使用。 *args 允许你做的是接受比你之前定义的正式参数数量更多的参数。使用 *args,可以将任意数量的额外参数附加到当前的形式参数上(包括零个额外参数)。 例如,我们想要创建一个乘法函数,该函数接受任意数量的参数,并能够将它们相乘。可以使用 *args 来完成。 使用 *,我们与 * 关联的变量变得可迭代,这意味着您可以执行诸如迭代它、运行一些高阶函数(例如 map
和 filter
)等操作。
demo 1:
Python 程序,演示可变变量参数 *args
python
def myFun(*args):
for arg in args:
print(arg)
myFun("Hello", "Welcome", "to", "demo007x", 100)
输出
css
Hello
Welcome
to
demo007x
100
在上面的例子中我们可以看到 *args
是一个 str 类型可变参数的 list。
不过在很多情况下面我们需要一个或者更多的固定参数,那这种情况我们如何做呢?
demo 2:
固定参数与可变参数一起
python
def myFun2(arg1, *args):
print("First argument through *args:", arg1)
for arg in args:
print("Next arg through *argv:", arg)
myFun2("Hello", "Welcome", "to", "demo007x", 100)
输出
vbnet
First argument through *args: Hello
Next arg through *argv: Welcome
Next arg through *argv: to
Next arg through *argv: demo007x
Next arg through *argv: 100
从输出中我们可以看出 参数arg1
获取到的值永远是调用函数 myFun2
传入的第一个值。myFun2
非第一个值都被*args
接收。
什么是 Python **kwargs?
Python
函数定义中的特殊语法 **kwargs
用于传递关键字、可变长度的参数列表。我们使用带有双星的名称 kwargs
。原因是双星允许我们通过关键字参数(以及任意数量的参数)。
关键字参数是指在将变量传递到函数中时为其提供名称的位置。
人们可以把 kwargs 看作是一本字典,它将每个关键字映射到我们传递的值。这就是为什么当我们遍历 kwargs 时,它们似乎没有任何打印顺序。
demo1
Python
程序,用于说明可变数量的关键字参数的 kwargs。这里 **kwargs
接受函数调用传递的关键字可变长度参数。for first='demo007x' 首先是关键,'demo007x' 是一个值。简单来说,我们赋予的就是值,而我们赋予谁才是关键。
python
def myFun2(**kwargs):
for key, value in kwargs.items():
print("%s == %s" % (key, value))
myFun2(first='demo', mid='007', last='x')
输出:
ini
first == demo
mid == 007
last == x
从输出结果中我们可以看到,kwargs 接收的是关键字参数,也就是具名参数的统一接收器。
demo2
Python
程序,用于说明具有一个额外参数的可变数量的关键字参数的 **kwargs
。都一样,但一个变化是我们传递了位置参数(myFun 中的 arg1)可以接受的非关键字参数。我们传递的关键字参数是 **kwargs
可以接受的。很简单吧?
python
def myFun3(arg1, **kwargs):
print("arg1 = %s" % arg1)
for key , val in kwargs.items():
print("%s == %s" % (key, val))
myFun3("Hi", first='demo', mid='007', last='x')
输出
ini
arg1 = Hi
first == demo
mid == 007
last == x
观察结果中,我们发现第一个参数 arg1
接收到的值就是参数 Hi
,是一个匿名参数.
我们重新定义一个函数myFun4
, 修改如下:
python
def myFun3(*args, **kwargs):
print("args = " ,args)
for key , val in kwargs.items():
print("%s == %s" % (key, val))
myFun3("Heloo", "world", first='demo', mid='007', last='x')
输出结果:
ini
args = ('Heloo', 'world')
first == demo
mid == 007
last == x
观察结果,我们发现 args
参数中接收到的是一个不具名参数的list。
在 Python 中使用 *args 和 **kwargs
来调用函数
示例 1:
在这里,我们将 *args
和 **kwargs
作为 myFu
n 函数中的参数传递。将 *args
传递给 myFun
只是意味着我们传递 args
包含的位置参数和可变长度参数。 因此,"Geeks"传递给 arg1,"for"传递给 arg2,"Geeks"传递给 arg3。当我们将 **kwargs 作为参数传递给 myFun 时,这意味着它接受关键字参数。在这里,"arg1"是键,值是"Geeks",它传递给 arg1,就像"for"和"Geeks"分别传递给 arg2 和 arg3 一样。传递完所有数据后,我们将按行打印所有数据。
python
def myFun(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
# Now we can use *args or **kwargs to
# pass arguments to this function :
args = ("Geeks", "for", "Geeks")
myFun(*args)
kwargs = {"arg1": "Geeks", "arg2": "for", "arg3": "Geeks"}
myFun(**kwargs)
输出
makefile
arg1: Geeks
arg2: for
arg3: Geeks
arg1: Geeks
arg2: for
arg3: Geeks
示例 2:
在这里,我们将 *args
和 **kwargs
作为 myFun 函数中的参数传递。其中 'geeks', 'for', 'geeks' 作为 *args 传递,first="Geeks", mid="for", last="Geeks" 作为 **kwargs
传递并在同一行中打印。
python
def myFun(*args, **kwargs):
print("args: ", args)
print("kwargs: ", kwargs)
myFun('geeks', 'for', 'geeks', first="Geeks", mid="for", last="demo007x")
输出
css
args: ('geeks', 'for', 'demo007x')
kwargs: {'first': 'Geeks', 'mid': 'for', 'last': 'demo007x'}
在 Python 中使用 *args 和 **kwargs 设置对象的值
- *args 以元组形式接收参数。
- **kwargs 将参数作为字典接收。
示例 1:使用 Python *args
python
class car():
def __init__(self, *args):
self.speed = args[0]
self.color = args[1]
audi = car(200, 'red')
bmw = car(250, 'black')
mb = car(190, 'white')
print(audi.color)
print(bmw.speed)
输出:
red
250
示例 2:使用 Python **kwargs
python
class car():
def __init__(self, **kwargs):
self.speed = kwargs['s']
self.color = kwargs['c']
audi = car(s=200, c='red')
bmw = car(s=250, c='black')
mb = car(s=190, c='white')
print(audi.color)
print(bmw.speed)