详解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)
相关推荐
Chloe.Zz1 分钟前
Python基础知识回顾
python
骑个小蜗牛5 分钟前
Python 标准库:random——随机数
python
万亿少女的梦16811 分钟前
基于Spring Boot的网络购物商城的设计与实现
java·spring boot·后端
Trouvaille ~15 分钟前
【机器学习】从流动到恒常,无穷中归一:积分的数学诗意
人工智能·python·机器学习·ai·数据分析·matplotlib·微积分
是十一月末32 分钟前
Opencv实现图像的腐蚀、膨胀及开、闭运算
人工智能·python·opencv·计算机视觉
云空39 分钟前
《探索PyTorch计算机视觉:原理、应用与实践》
人工智能·pytorch·python·深度学习·计算机视觉
dowhileprogramming1 小时前
Python 中的迭代器
linux·数据库·python
开心工作室_kaic2 小时前
springboot485基于springboot的宠物健康顾问系统(论文+源码)_kaic
spring boot·后端·宠物
0zxm2 小时前
08 Django - Django媒体文件&静态文件&文件上传
数据库·后端·python·django·sqlite
灰太狼不爱写代码4 小时前
CUDA11.4版本的Pytorch下载
人工智能·pytorch·笔记·python·学习