目录
动态参数的定义
*args
*kwargs
万能参数
作者:
编辑:
版本:
孙凯
张德鑫
python3
动态参数的定义
顾名思义,动态参数就是传入的参数个数是动态的,可以是零个或多个,在不需要的时候,就可以把它忽略,不用传递任何值。Python里面的动态参数有两种:*args和**kwargs,这里面的关键区别在于是一个星还是两个星,名字上的区别不是最主要的,其实你可以另外定义两个名字,但是别忘了带上*,只是默认情况是*args和**kwargs。
*args
一个星号表示接收任意个参数。调用时,会将实际参数打包成一个元组传入形式参数。如果参数是个列表,会将整个列表当做一个参数传入。例如:
def func(*args):
for arg in args:
print(arg)
func('A', 'B', 'C')
li = [1, 2, 3]
func(li) #不使用*被认为列表被当成一个整体传递给位置参数
运行结果:
A
B
C
[1,2,3]
通过循环args,我们可以获得传递的每个参数。但是li这个列表,我们本意是让它内部的1,2,3分别当做参数传递进去,但实际情况是列表本身被当做一个整体给传递进去了。怎么办呢?使用一个星号!
将上述代码第6行改为
func(*li) #使用*使得列表里面的数据分别传递给位置参数
两个星表示接受键值对的动态参数,数量任意。调用的时候会将实际参数打包成字典。例如:
def func(**kwargs):
for kwg in kwargs:
print(kwg, kwargs[kwg])
func(k1='v1', k2=[0, 1, 2])
运行结果是:
k1 v1
k2 [0, 1, 2]
而如果我们这样传递一个字典dic呢?我们希望字典内的键值对能够像上面一样被逐一传入。
def func(**kwargs):
for kwg in kwargs:
print(kwg, kwargs[kwg])
dic = {
'k1': 'v1',
'k2': 'v2'}
func(dic)
实际结果却是弹出错误,为什么?
因为这时候,我们其实是把dic当做一个位置参数传递给了func函数。而func函数并不接收任何位置函数。那怎么办呢?使用两个星号!
def func(**kwargs):
for kwg in kwargs:
print(kwg, kwargs[kwg])
dic = {
'k1': 'v1',
'k2': 'v2'}
func(**dic)
有了前面一个星号的基础,这里我们应该很好理解了。两个星号能将字典内部的键值对逐一传入**kwargs。
“万能”参数
当*args和**kwargs组合起来使用,理论上能接受任何形式和任意数量的参数,在很多代码中我们都能见到这种定义方式。需要注意的是,*args必须出现在**kwargs之前。
def func(*args, **kwargs):
for arg in args:
print(arg)
for kwg in kwargs:
print(kwg, kwargs[kwg])
lis = [1, 2, 3]
dic = {
'k1': 'v1',
'k2': 'v2'}
func(*lis, **dic)
运行结果:
1
2
3
k1 v1
k2 v2
思考
现在你可以说出动态参数*args和**kwargs的区别了吗?
python基础系列目录
★
基本概念
常量及变量
数据类型
数据类型转化
运算符
运算符
运算符优先级
数据结构
列表
元组
字典
序列
控制流
if语句
while语句
for循环
break语句
continue语句
函数
函数形参
局部变量
默认参数值
动态参数
return语句
字符串文档
配套教学视频
本系列练习可以配合计算机二级视频一起食用,观看地址为:
https://study.163.com/course/introduction.htm?courseId=1006044085

理解编程语言,探索数据奥秘
每日练习|干货分享|新闻资讯|公益平台。
每天学习一点点,你将会见到全新的自己。

长按识别二维码关注




