本文我们将通过示例了解 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传递可变数目的关键字参数,以便在其上执行字典的操作。

--- END

Python可变参数*args和**kwargs的更多相关文章

  1. Python函数可变参数*args及**kwargs详解

    初学Python的同学们看到代码中类似func(*args, **kwargs)这样的函数参数定义时,经常感到一头雾水. 下面通过一个简单的例子来详细解释下Python函数可变参数*args及**kw ...

  2. python可变参数*args, **kwargs

    python可变参数*args, **kwargs def foo(* args, ** kwargs): print ' args = ',  args print ' kwargs = ',  k ...

  3. 理解 Python 中的可变参数 *args 和 **kwargs:

    默认参数:  Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def getSum(x,y=5): print "x:", x print "y:& ...

  4. Python函数参数*args和**kwargs

    1. Python中使用*args和**kwargs #!/usr/bin/env python3 # coding: utf-8 # File: args_kwargs_demo.py # Auth ...

  5. [Python学习笔记-004] 可变参数*args和**kwargs

    在Python中,可变参数的传递使用*args和**kwargs来实现,其中: *args表示任意个位置参数(positional argument),被表示为一个只读的数组(tuple): **kw ...

  6. python函数可变参数*args和**kwargs区别

    #*args(元组列表)和**kwargs(字典)的区别 def tuple_test(*args): for i in args: print 'hello'+i s=('xuexi','mili' ...

  7. python中应用*args 与**kwargs

    这是Python函数可变参数 args及kwargs------->目的是:当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值. ...

  8. Java可变参数 & Python可变参数 & Scala可变参数

    Java 可变参数的特点: (1).只能出现在参数列表的最后: (2)....位于变量类型和变量名之间,前后有无空格都可以: (3).调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体 ...

  9. python 可变参数函数定义* args和**kwargs的用法

    python函数可变参数 (Variable Argument) 的方法:使用*args和**kwargs语法.其中,*args是可变的positional arguments列表,**kwargs是 ...

随机推荐

  1. dfs+search

    1.数的划分 点击查看搜索 #include<iostream> #include<cstdio> #include<cmath> #include<algo ...

  2. 关于spring data redis repository @RedisHash注解的对象上有DateTime属性字段的问题

    当你save保存的时候你会发现出现StackOverflow Exception,很明显出现了无限循环,可是仅仅是一个save操作,哪里来的无限循环呢? 最终发现就是DateTime导致的,因为将对象 ...

  3. 基于GDAL库,读取.grd文件(以海洋地形数据为例)C++版

    技术背景 海洋地形数据主要是通过美国全球地形起伏数据(GMT)获得,数据格式为grd(GSBG)二进制数据,打开软件通过是Surfer软件,surfer软件可进行数据的编辑处理,以及进一步的可视化表达 ...

  4. 2、Linux基础--常用系统命令与快捷键

    笔记 1.昨日问题 1.mac系统虚拟机的问题 2.虚拟机连不上网 1.xshell连接不上 1.虚拟网络编辑器和vmnat8网卡设置错误 2.ping不通百度 1.DNS IP编写错误 2.网卡的网 ...

  5. MySQL高级优化

    MySQL高级 1.索引是什么? (1)索引是排好序可以快速查找的数据结构 (2)方便快速查找,索引实际上也是一张表所以也是要占内存的 2.索引存在哪里? (1)InnoDB引擎 ①索引是和数据存放在 ...

  6. pytest--pytest基本介绍

    pytest简介 pytest 是 python 的第三方单元测试框架,比自带的 unittest 更简洁和高 效,同时兼容 unittest 框架.它还有如下优点: 1.简单灵活,容易上手,文档丰富 ...

  7. 微信小程序wifi控制开发

    小程序wifi控制开发方案 ----- 由小程序通过公众号给wifi控制板进行配网,后台服务器自动生成设备名并注册在数据库中,wifi控制板自动保存生成的设备名,小程序可读取WIFI控制板的数据,控制 ...

  8. sql注入之报错注入and boolean注入

    1.sql注入之报错注入 正常传参,返回页面正常: 加入'  返回页面报错,出现"zhangsan"' 报错注入使用的函数 在这里我们使用 select updatexml(1,c ...

  9. json系列(一)cjson,rapidjson,yyjson解析示例

    前言 项目上通过消息中间件传输json格式的数据,其他接收模块需要对json格式的数据进行解析,反序列化.对json解析工具有几个关注点,一是具备解析和构造的基础功能,二是具备解析和构造的高性能,三是 ...

  10. 【C# 线程】Windows系统下常见的7种I/O模型 之Overlapped I/O模型

    overview 这个字符到底是什么含义呢?其实它的意思就是当程序在等待设备操作的时候,可以继续往下做而不必阻塞到那个地方等待设备操作的返回,这就造成了程序运行和设备操作时间上的重叠.  Overla ...