Python可变参数*args和**kwargs

 更新时间:2022年03月23日 08:37:02   作者:深蓝小佛  
本文我们将通过示例了解 Python函数的可变参数*args和 **kwargs的用法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文我们将通过示例了解 Python函数的可变参数*args和 **kwargs的用法。

知识预备:Python 函数和 Python 函数参数

在Python编程中,我们定义一个函数来生成执行类似操作的可重用代码。为了执行这个操作,我们调用一个具有特定值的函数,这个值在 Python 中称为函数参数。

函数示例

假设,我们定义了一个3个数相加的函数。

示例1: 用于加3个数字的函数

# 定义函数
def add(x, y, z):
    print(f"总和: {x+y+z}")

# 调用函数
add(10,12,13)

当我们运行上面的程序时,将会输出如下结果:

总和: 35

在上面的程序中,我们有三个参数 x,y 和 z 的加法函数。当我们在调用 add()函数传递三个值时,我们得到这三个数字的和作为输出。

接下来,让我们看看当我们在add()函数中传递超过3个参数时会发生什么。

# 定义函数
def add(x, y, z):
    print(f"总和: {x+y+z}")

# 调用函数
add(5,10,15,20,25)

当我们运行上面的程序时,输出将是

TypeError: add() takes 3 positional arguments but 5 were given

在上面的程序中,我们给add()函数传递了5个参数,而不是由于3个参数,并且得到 TypeError 错误。

这很显然不是我们想要的效果,那么应该怎么解决这个问题呢?

如果我们实际调用的时候,如果入参的个数是不确定的,就可以使用可变参数的语法来解决。

Python可变参数

在 Python 中,我们可以使用特殊符号向函数传递可变数量的参数。

有两个特殊的符号:

  • *args:可变位置参数
  • **kwargs:可变关键字参数

当我们不确定要在函数中传递的参数数量时,我们就可以在函数定义中,使用 *args 和 **kwargs 作为形式参数。

Python *args

正如上面的例子一样,我们不确定可以传递给函数的参数数量。有 *args,允许我们传递可变数量的非关键字参数到函数中。

在函数定义中,我们应该在参数名之前使用星号 * 来传递可变长度的参数。参数以元组的形式传递,这些传递的参数在函数内部使用
与参数(不包括星号 *)相同的名称构成元组。

例2: 使用 *args 将可变长度的参数传递给函数

# 定义函数
def add(*num):
    sum = 0
    for n in num:
        sum = sum + n
    print(f"总和: {sum}")

# 调用函数
add(3,5)
add(4,5,6,7)
add(1,2,3,5,6)

在上面的程序中,我们使用 *num 声明形式参数,它允许我们向 add() 函数传递可变长度的参数列表。在函数内部,我们有一个循环,
它把传递的实际参数相加,并打印结果。注意,这里调用了3次,分别传递了不同的值,它们的长度可变,作为函数的实际参数。

当我们运行上面的程序时,输出将是:

总和: 8
总和: 22
总和: 17

Python **kwargs

对于传递关键字参数这个问题,Python 有一个名为 **kwargs 的解决方案,它允许我们将可变长度的关键字参数传递给函数。

具体做法是,在函数中,我们在参数名之前使用双星号**来表示这种类型的参数。接收到的参数在函数内构成一个dict字典对象,
其名称与参数(不包括两个星号**)相同。

示例3: 使用 **kwargs 将可变关键字参数传递给函数

# 定义函数
def intro(**data):

    print("实参的数据类型是:",type(data))

    for key, value in data.items():
        print(f"{key} is {value}")

# 调用函数
intro(name="小佛", age=30)
intro(city="深圳", lan="Python", hobby="干饭")

在上面的程序中,我们定义了一个以 **data 数据为形参的函数 intro ()。我们将两个长度可变的字典实参传递给 intro()函数。
我们intro()函数中使用for循环,它对传递字典的数据项进行处理,并输出字典的值。

当我们运行上面的程序时,输出将是:

实参的数据类型是: <class 'dict'>
name:小佛
age:30
实参的数据类型是: <class 'dict'>
city:深圳
lan:Python
hobby:干饭

总结

值得注意的几点:

  • *args**kwargs让函数变得非常灵活。
  • *args**kwargs是特殊的关键字,允许函数采用可变长度参数。
  • *args**kwargs是约定俗称的名称,可以自定义,例如*cat,或者**dog
  • *args传递可变数量的位置参数,并且可以在其上执行元组的操作。
  • **kwargs传递可变数目的关键字参数,以便在其上执行字典的操作。

 到此这篇关于Python可变参数*args和**kwargs的文章就介绍到这了,更多相关Python *args **kwargs内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Django 重写用户模型的实现

    Django 重写用户模型的实现

    这篇文章主要介绍了Django 重写用户模型的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python中的super()方法使用简介

    Python中的super()方法使用简介

    这篇文章主要介绍了Python中的super()方法的使用,是Python入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • 用python爬取租房网站信息的代码

    用python爬取租房网站信息的代码

    今天小编就为大家分享一篇关于用python爬取租房网站信息的代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • python计算书页码的统计数字问题实例

    python计算书页码的统计数字问题实例

    这篇文章主要介绍了python计算书页码的统计数字问题实例,对比2个实例讲述了数字统计的技巧,非常实用,需要的朋友可以参考下
    2014-09-09
  • python读取图片的方式,以及将图片以三维数组的形式输出方法

    python读取图片的方式,以及将图片以三维数组的形式输出方法

    今天小编就为大家分享一篇python读取图片的方式,以及将图片以三维数组的形式输出方法,具有好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • 使用PyTorch实现去噪扩散模型的完整代码

    使用PyTorch实现去噪扩散模型的完整代码

    在本文中,我们将深入研究DDPM的复杂性,涵盖其训练过程,包括正向和逆向过程,并探索如何执行采样,在整个探索过程中,我们将使用PyTorch从头开始构建DDPM,并完成其完整的训练,需要的朋友可以参考下
    2024-01-01
  • Python+OpenCv制作证件图片生成器的操作方法

    Python+OpenCv制作证件图片生成器的操作方法

    这篇文章主要介绍了Python+OpenCv制作证件图片生成器的操作方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • python 读入多行数据的实例

    python 读入多行数据的实例

    下面小编就为大家分享一篇python 读入多行数据的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • django一对多模型以及如何在前端实现详解

    django一对多模型以及如何在前端实现详解

    这篇文章主要介绍了django一对多模型以及如何在前端实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 零基础写python爬虫之爬虫编写全记录

    零基础写python爬虫之爬虫编写全记录

    前面九篇文章从基础到编写都做了详细的介绍了,第十篇么讲究个十全十美,那么我们就来详细记录一下一个爬虫程序如何一步步编写出来的,各位看官可要看仔细了
    2014-11-11

最新评论