详解Python 中的 *args 和 **kwargs的用法

详解Python 中的 *args 和 **kwargs的用法

在本文中,我们将介绍 **(双星/星号)和 *(星号/星号)对 Python 中的参数有什么作用,在这里,我们还将介绍 Python 中的 argskwargs 示例。我们可以使用特殊符号将可变数量的参数传递给函数。

有两个特殊符号:

用于在 Python 中传递参数的特殊符号:

  • *args(非关键字参数)
  • **kwargs(关键字参数)

"当我们对函数中应该传递的参数数量有疑问时,我们使用这样的"通配符"或" "符号------ args 或 **kwargs------作为函数的参数。"

什么是 Python *args?

Python 函数定义中的特殊语法 *args 用于将可变数量的参数传递给函数。它用于传递非关键字、可变长度的参数列表。

语法是使用符号 * 来接收可变数量的参数;按照惯例,它通常与单词 args 一起使用。 *args 允许你做的是接受比你之前定义的正式参数数量更多的参数。使用 *args,可以将任意数量的额外参数附加到当前的形式参数上(包括零个额外参数)。 例如,我们想要创建一个乘法函数,该函数接受任意数量的参数,并能够将它们相乘。可以使用 *args 来完成。 使用 *,我们与 * 关联的变量变得可迭代,这意味着您可以执行诸如迭代它、运行一些高阶函数(例如 mapfilter)等操作。

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 作为 myFun 函数中的参数传递。将 *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)
相关推荐
攸攸太上8 分钟前
Spring Gateway学习
java·后端·学习·spring·微服务·gateway
罗曼蒂克在消亡24 分钟前
graphql--快速了解graphql特点
后端·graphql
潘多编程27 分钟前
Spring Boot与GraphQL:现代化API设计
spring boot·后端·graphql
萧鼎41 分钟前
Python调试技巧:高效定位与修复问题
服务器·开发语言·python
IFTICing1 小时前
【文献阅读】Attention Bottlenecks for Multimodal Fusion
人工智能·pytorch·python·神经网络·学习·模态融合
大神薯条老师1 小时前
Python从入门到高手4.3节-掌握跳转控制语句
后端·爬虫·python·深度学习·机器学习·数据分析
程序员爱德华1 小时前
Python环境安装教程
python
huanxiangcoco1 小时前
152. 乘积最大子数组
python·leetcode
萧鼎2 小时前
Python常见问题解答:从基础到进阶
开发语言·python·ajax
2401_857622662 小时前
Spring Boot新闻推荐系统:性能优化策略
java·spring boot·后端