Python 中的 *args 和 **kwargs 是什么 - 示例指南
当我们看到任何包含 * args和 ** kwargs的函数的文档时,您是否想过 - 该函数内部传递的这些奇怪的参数是什么?
举个例子:
function(params, *args, **kwargs)
作为初学者,您可能会对如何使用该函数或在调用该函数时作为参数传递什么来代替 * args和 ** kwargs感到困惑。
不用担心,在本教程中我们将讨论*args
-**kwargs
它们的含义以及它们在函数中的用途,并提供示例来帮助您更好地理解。
我们将看到 示例中使用的*
and (拆包运算符)。**
介绍
Python 中的函数帮助我们编写可重用的代码,以在各种操作中执行特定任务。
让我们定义一个打印角色名称的函数。
示例: function
打印角色名称
def characters(name1, name2, name3):
print(name1, name2, name3)
characters("Iron Man", "Black Panther", "Captain America")
输出
Iron Man Black Panther Captain America
上面的函数characters
接受 3 个位置参数name1
, name2
,name3
并简单地打印名称。
如果我们传递的参数数量超过了它所需要的参数数量怎么办
def characters(name1, name2, name3):
print(name1, name2, name3)
characters("Iron Man", "Black Panther", "Captain America", "Hulk")
你认为输出会是什么,输出将是一个TypeError
.
TypeError: characters() takes 3 positional arguments but 4 were given
引发错误的原因是函数内部传递了额外的参数,该函数只接受三个参数。
这是不幸的,因为我们需要在函数内再传递一个参数character
,以使代码运行时不会出错。
然而,这不是最佳实践。例如,假设您正在开发一个项目,在调用特定函数时需要动态添加多个参数。
在这种情况下你应该做什么?有一种方法可以处理这种情况。
*args 的用法
*args
只是为了参数而缩短。当我们不确定应该在 中传递多少个参数时,它被用作参数function
。
*
前面的星号确保args
参数具有可变长度。
*args
是非关键字参数或位置参数。
通过使用*args
,您可以在调用函数时传递任意数量的参数。
*args
示例:在函数定义中使用
def friends(*args):
print(args)
friends("Sachin", "Rishu", "Yashwant", "Abhishek")
输出
('Sachin', 'Rishu', 'Yashwant', 'Abhishek')
我们之所以得到这样的结果Tuple
,是因为当我们使用*args
该函数时,将得到参数 as tuple
。
如果我们检查类型。
def friends(*args):
print(type(args))
print(args)
friends("Sachin", "Rishu", "Yashwant", "Abhishek")
输出
<class 'tuple'>
('Sachin', 'Rishu', 'Yashwant', 'Abhishek')
我们还可以将常规参数与 一起使用*args
。
示例:在函数定义中使用常规参数和 args
def friends(greet, *args):
for friend in args:
print(f"{greet} to Python, {friend}")
greet = "Welcome"
friends(greet, "Sachin", "Rishu", "Yashwant", "Abhishek")
输出
Welcome to Python, Sachin
Welcome to Python, Rishu
Welcome to Python, Yashwant
Welcome to Python, Abhishek
注意:您可以使用任何您想要的名字来代替 args
,包括您的宠物的名字、朋友的名字,甚至是您女朋友的名字,只要您在 *
前面加上 即可。
示例:使用不同的名称代替参数
def dog(prefix, *german_shepherd):
for breed in german_shepherd:
print(f"The {prefix} is {breed}.")
prefix = "breed"
dog(prefix, "Labrador", "GSD", "Chihuahua")
输出
The breed is Labrador.
The breed is GSD.
The breed is Chihuahua.
有一个例外:将常规参数作为*args
参数传递给函数时,切勿*args
在常规参数之前传递。
示例:*args
在函数内的常规参数之前使用
def heroes(*characters, country):
for character in characters:
print(f"{character} is from {country}.")
country = "USA"
heroes(country, "Iron Man", "Captain America", "Spiderman")
输出
TypeError: heroes() missing 1 required keyword-only argument: 'country'
我们得到 a 是因为我们不能在常规参数之前TypeError
通过。*args
如果我们更改代码并移动函数内部传递的参数,则不会出现错误。
def heroes(country, *characters):
for character in characters:
print(f"{character} is from {country}.")
country = "USA"
heroes(country, "Iron Man", "Captain America", "Spiderman")
输出
Iron Man is from USA.
Captain America is from USA.
Spiderman is from USA.
上面的代码执行没有任何错误。
**kwargs 的用法
**kwargs
被缩短为关键字参数。
现在您已经熟悉*args
并了解了它的实现,**kwargs
其工作原理与*args
.
但与 不同的是*args
,**kwargs
它接受关键字或命名参数。
在 中**kwargs
,我们使用**
双星号来允许我们传递关键字参数。
**kwargs
示例:在函数定义中使用
def hello(**kwargs):
print(type(kwargs))
for key, value in kwargs.items():
print(f"{key} is {value}.")
hello(One = "Red", two = "Green", three = "Blue")
输出
<class 'dict'>
One is Red.
two is Green.
three is Blue.
oftype
是字典**kwargs
,即接受的参数为。key-value
**kwargs
示例:在函数定义中使用常规参数 and
def hello(write, **kwargs):
print(write)
for key, value in kwargs.items():
print(f"{key} is {value}.")
write = "RGB stands for:"
hello(write, One = "Red", two = "Green", three = "Blue")
输出
RGB stands for:
One is Red.
two is Green.
three is Blue.
就像*args
,你可以选择任何名称而不是**kwargs
示例:使用不同的名称代替 kwargs
def hello(write, **color):
print(write)
for key, value in color.items():
print(f"{key} is {value}.")
write = "RGB stand for:"
hello(write, One = "Red", two = "Green", three = "Blue")
输出
RGB stand for:
One is Red.
two is Green.
three is Blue.
注意:我们不能在函数定义中传递**kwargs
before ,否则我们会得到一个.*args
SyntaxError
约定应该是—— function(params, *args, **kwargs)
例子
我们可以在函数定义中使用所有三种类型的参数,在本示例中,我们将看到解包运算符-*
和的使用**
。
def friends(greet, *args, **kwargs):
for names in args:
print(f"{greet} to the Programming zone {names}")
print("\nI am Veronica and I would like to announce your roles:")
for key, value in kwargs.items():
print(f"{key} is a {value}")
greet = "Welcome"
names = ["Sachin", "Rishu", "Yashwant", "Abhishek"]
roles = {"Sachin":"Chief Instructor", "Rishu":"Engineer",
"Yashwant":"Lab Technician", "Abhishek":"Marketing Manager"}
friends(greet, *names, **roles)
输出
Welcome to the Programming zone Sachin
Welcome to the Programming zone Rishu
Welcome to the Programming zone Yashwant
Welcome to the Programming zone Abhishek
I am Veronica and I would like to announce your roles:
Sachin is a Chief Instructor
Rishu is a Engineer
Yashwant is a Lab Technician
Abhishek is a Marketing Manager
您会注意到上面代码中使用了名为names
和 的变量。roles
但是,当我们在函数内部传递它们时,我们将它们放在变量*
之前names
和变量**
之前。roles
这些是拆包操作符。
拆箱操作员
正如您在上面看到的,这些运算符非常方便。
*
单星号用于解包可迭代对象,**
双星号用于解包字典。
可迭代
*
解包运算符和**
字典解包运算符允许在更多位置、任意次数以及其他情况下进行解包。具体来说,在函数调用、推导式和生成器表达式以及显示中。
- 点赞
- 收藏
- 关注作者
评论(0)