Python可变参数*args和**kwargs

目录
  • 函数示例
  • Python可变参数
    • Python *args
    • Python **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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python可变参数*args和**kwargs用法实例小结

    本文实例讲述了Python可变参数*args和**kwargs用法.分享给大家供大家参考,具体如下: 一句话简单概括:当函数的参数不确定的时候就需要用到*args和**kwargs,前者和后者的区别在于,后者引入了"可变"key的概念,而前者没有key的概念,具体看下面的使用样例和具体的解释即可: #!usr/bin/env python #encoding:utf-8 ''''' __Author__:沂水寒城 功能:*args 和 **kwargs ''' def test_fun

  • Python可变参数*args和**kwargs

    目录 函数示例 Python可变参数 Python *args Python **kwargs 总结 本文我们将通过示例了解 Python函数的可变参数*args和 **kwargs的用法. 知识预备:Python 函数和 Python 函数参数 在Python编程中,我们定义一个函数来生成执行类似操作的可重用代码.为了执行这个操作,我们调用一个具有特定值的函数,这个值在 Python 中称为函数参数. 函数示例 假设,我们定义了一个3个数相加的函数. 示例1: 用于加3个数字的函数 # 定义函

  • Python可变参数函数用法实例

    本文实例讲述了Python可变参数函数用法.分享给大家供大家参考.具体如下: #!/usr/bin/python def f1(a,b): print a,b def f2(a,*b): print a,b def f3(a,**b): print a,b def f4(a,*b,**c): print a,b,c def f5(a,b=2,c=3): print a,b,c def f6(a,b=2,*c): print a,b,c f1(1,2) f1(b=2,a=1) f2(1,2,3,4

  • Python编程中*args与**kwargs区别作用详解

    相信学Python的小伙伴肯定有这样的尴尬局面,给一个函数不会用, 原因是:不知道参数列表中的类型是什么意思,比如初学者都会疑问的:*args和**kwargs到底是怎么用. 当你知道这个时,我猜你肯定能会用好多函数了! #*args的用法:当传入的参数个数未知,且不需要知道参数名称时. def func_arg(farg, *args): print("formal arg:", farg) for arg in args: print("another arg:"

  • Python可变参数用法实例分析

    本文实例讲述了Python可变参数用法.分享给大家供大家参考,具体如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import math def calc(*numbers): sum=0 for n in numbers: sum+=n**2 return sum print(calc(1,2,3)) print(calc(1,3,5,7)) print(calc()) 运行效果图如下: 定义可变参数和定义一个list或tuple参数相比,仅

  • Python可变参数会自动填充前面的默认同名参数实例

    最近在学习Python的时候遇到一个知识点,在此记录下来 可变参数会自动填充前面的同名默认参数 比如下面这个函数 def add_student(name="Bob", **info_dict): print(name) 如果info_dict里面也有name,当我们这样调用时 info_dict = { "name" : "Tom", "age" : 20 } add_student(**info_dict)# Tom 那么

  • Python函数中*args和**kwargs来传递变长参数的用法

    单星号形式(*args)用来传递非命名键可变参数列表.双星号形式(**kwargs)用来传递键值可变参数列表. 下面的例子,传递了一个固定位置参数和两个变长参数. def test_var_args(farg, *args): print "formal arg:", farg for arg in args: print "another arg:", arg test_var_args(1, "two", 3) 结果如下: formal ar

  • python函数参数*args**kwargs用法实例

    复制代码 代码如下: #coding=utf8__author__ = 'Administrator' # 当函数的参数不确定时,可以使用*args和**kwargs.*args没有key值,**kwargs有key值 def fun_var_args(farg, *args):    print 'args:', farg    for value in args:        print 'another arg:',value # *args可以当作可容纳多个变量组成的list或tupl

  • Python关键字及可变参数*args,**kw原理解析

    可变参数 顾名思义,函数的可变参数是传入的参数可以变化的,1个,2个到任意个.当然可以将这些 参数封装成一个 list 或者 tuple 传入,但不够 pythonic.使用可变参数可以很好解决该问题,注意可变参数在函数定义不能出现在特定参数和默认参数前面,因为可变参数会吞噬掉这些参数. def report(name, *grades): total_grade = 0 for grade in grades: total_grade += grade print(name, 'total g

  • django中的*args 与 **kwargs使用介绍

    这是Python函数可变参数 args及kwargs *args表示任何多个无名参数,它是一个tuple **kwargs表示关键字参数,它是一个dict 测试代码如下: def foo(*args,**kwargs): print 'args=',args print 'kwargs=',kwargs print '**********************' if __name__=='__main__': foo(1,2,3) foo(a=1,b=2,c=3) foo(1,2,3,a=1

随机推荐