Python 中的 *args 和 **kwargs 是什么 - 示例指南

举报
Q神 发表于 2023/06/24 16:08:20 2023/06/24
【摘要】 当我们看到任何包含 * args和 ** kwargs的函数的文档时,您是否想过 - 该函数内部传递的这些奇怪的参数是什么?举个例子:function(params, *args, **kwargs)作为初学者,您可能会对如何使用该函数或在调用该函数时作为参数传递什么来代替 * args和 ** kwargs感到困惑。不用担心,在本教程中我们将讨论*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 个位置参数name1name2,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.

注意:我们不能在函数定义中传递**kwargsbefore ,否则我们会得到一个.*argsSyntaxError

约定应该是—— 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

这些是拆包操作符

拆箱操作员

正如您在上面看到的,这些运算符非常方便。

*单星号用于解包可迭代对象,**双星号用于解包字典。

可迭代*解包运算符和**字典解包运算符允许在更多位置、任意次数以及其他情况下进行解包。具体来说,在函数调用、推导式和生成器表达式以及显示中。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。