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
传递可变数目的关键字参数,以便在其上执行字典的操作。
--- END
Python可变参数*args和**kwargs的更多相关文章
- Python函数可变参数*args及**kwargs详解
初学Python的同学们看到代码中类似func(*args, **kwargs)这样的函数参数定义时,经常感到一头雾水. 下面通过一个简单的例子来详细解释下Python函数可变参数*args及**kw ...
- python可变参数*args, **kwargs
python可变参数*args, **kwargs def foo(* args, ** kwargs): print ' args = ', args print ' kwargs = ', k ...
- 理解 Python 中的可变参数 *args 和 **kwargs:
默认参数: Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def getSum(x,y=5): print "x:", x print "y:& ...
- Python函数参数*args和**kwargs
1. Python中使用*args和**kwargs #!/usr/bin/env python3 # coding: utf-8 # File: args_kwargs_demo.py # Auth ...
- [Python学习笔记-004] 可变参数*args和**kwargs
在Python中,可变参数的传递使用*args和**kwargs来实现,其中: *args表示任意个位置参数(positional argument),被表示为一个只读的数组(tuple): **kw ...
- python函数可变参数*args和**kwargs区别
#*args(元组列表)和**kwargs(字典)的区别 def tuple_test(*args): for i in args: print 'hello'+i s=('xuexi','mili' ...
- python中应用*args 与**kwargs
这是Python函数可变参数 args及kwargs------->目的是:当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值. ...
- Java可变参数 & Python可变参数 & Scala可变参数
Java 可变参数的特点: (1).只能出现在参数列表的最后: (2)....位于变量类型和变量名之间,前后有无空格都可以: (3).调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体 ...
- python 可变参数函数定义* args和**kwargs的用法
python函数可变参数 (Variable Argument) 的方法:使用*args和**kwargs语法.其中,*args是可变的positional arguments列表,**kwargs是 ...
随机推荐
- FastJSON解析Json字符串(反序列化为List、Map)
在日常开发与数据库打交道的时候,常有以Json格式的字符串存储到数据库的情况,当在Java程序中获取到对应的Json格式的String字符串后,如何才能转换为我们想要的数据格式(比如转换成Java中的 ...
- Innodb之索引与算法
目录 一.概述 二.数据结构与算法 1.二分查找 2.二叉查找树和平衡二叉树 1)二叉查找树 2)平衡二叉树 三.B+树 1.B+树完整定义 2.关于 M 和 L的选定案例 四.B+树索引 1.聚集索 ...
- 3.HTTP协议详解
### Web核心+HTTP协议 准备工作:XAMPP+PhpWindd+Aglieone HTTP协议简介 HTTP请求 最常用请求 GET请求获取URL所标识的资源 POST请求在URL所标识的资 ...
- Ceres 四重奏 之 入门简介
Ceres 翻译为谷神星,是太阳系中的一颗矮行星,于1801年被意大利神父 Piazzi 首次观测到,但随后 Piazzi 因为生病,跟丢了它的运行轨迹. 几个月后,德国数学家 Gauss,利用最小二 ...
- Solution -「NOI.AC 省选膜你赛」寄蒜几盒
题目 题意简述 给定一个含有 \(n\) 个顶点的凸多边形( \(n\) 是偶数),对于每一对相对的边(即中间有 \(\frac{n}2-1\) 条其它边),延长它们以将平面分割为多块,并把包含原 ...
- CVE-2021-1732 LPE漏洞分析
概述 CVE-2021-1732是一个发生在windows内核win32kfull模块的LPE漏洞,并且由于创建窗口时调用win32kfull!xxxCreateWindowEx过程中会进行用户模式回 ...
- 黑客高端de浏览器使用秘籍
搜索引擎已经成为上网必不可少的工具之一,聪明的黑客们发现,搜索引擎也能成为发动网络攻击的工具. Google Hacking,原指利用Google搜索引擎搜索信息来进行入侵的技术和行为,如今已不再局限 ...
- vue中按需引入Element-ui
安装 1.安装element-ui:npm i element-ui -S. 2.安装babel-plugin-component:npm install babel-plugin-component ...
- nmtui解决network-scripts目录下无网卡对应配置文件问题
1.问题出现的原因设备先安装了操作系统,后插上网卡到设备,就会出现/etc/sysconfig/network-scripts目录下无该网卡对应配置文件的问题,但是ifconfig命令能看见系统给该网 ...
- 【C#集合】Hashtable 和 Dictionary的区别
Hashtable 和 Dictionary <K, V> 类型 1):单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分. 2):Diction ...