欢迎访问Python每天3分钟系列。
每天花3分钟时间,学习或温习一个Python知识点。今天是第041篇:
*args和**kwargs
这是麦友@小雪球的提问:
“想学习函数参数*args和**args的传递和使用。up主有时间安排一下呗
先来学习一下英文单词吧:
-
Arguments是参数的意思,args是这个单词的缩写,*args表示有很多个参数 -
Key Word Arguments是关键词参数的意思,kwargs是这个词组的缩写,**kwargs表示有很多对参数,两个星号表示是成对出现的
在Python的编程世界里:
-
*args表示可变参数,也就是说0个或者多个参数 -
kwargs表示可变关键词参数**,也就是说0个或多个关键词参数
可变参数 – *args
看这个函数,它的功能是做加法:
def add(a, b):
print(a + b)
add(123, 321)
输出结果:
444
这个函数只能做两个整数的加法,如果传入多个参数:
add(123, 321, 9527)
会抛出类型错误:add只接收两个参数,但是给了3个。
TypeError: add() takes 2 positional arguments but 3 were given
为了支持可变数量的参数,*args就派上了用场:
def add2(a, b, *more):
sum = a + b
for i in more:
sum = sum + i
print(sum)
add2(123,321)
add2(123,321,9527)
add2(123,321,9527, 3721)
输出结果:
444
9971
13692
第三个参数*more
表示后面还可以传入0个或多个参数。所以add2
函数可以执行2到无穷多个数字的相加。
那第3个参数*more
到底是何方神圣呢?我们具体如何使用它呢?我们探索一下:
def add2(a, b, *more):
print(type(more)) #打印一下more的类型
sum = a + b
for i in more:
sum = sum + i
print(sum)
add2(123,321)
add2(123,321,9527)
add2(123,321,9527, 3721)
我们在add2
的第一行打印一下more
的类型:
<class 'tuple'>
444
<class 'tuple'>
9971
<class 'tuple'>
13692
它是tuple,也就是普通的元组。那就简单了,我们把它当做元组去循环,访问,切片等等。还可以去修改,哦,不!元组是不可变对象。
可变关键词参数 – **args
**args
的用法非常类似,只不过它代表的是键值对参数。来看例子:
def make_coffee(size, flavour):
print('香喷喷的咖啡来了...')
print(f'大小:{size}')
print(f'风味:{flavour}')
make_coffee('大杯', '拿铁')
输入结果:
香喷喷的咖啡来了...
大小:大杯
风味:拿铁
这是一个制作咖啡的函数,你告诉它大小和风味,它会为你制作出来。
但是这很无聊。为了更好地满足客户需求,我们需要支持客户传入其他定制指令,比如:糖的数量,盐的数量,还有其他各种杂七杂八不确定的需求。
这时候**kwargs
派上用场了:
def make_coffee2(size, flavour, **others):
print(type(others))
print('香喷喷的咖啡来了...')
print(f'大小:{size}')
print(f'风味:{flavour}')
for k, w in others.items():
print(f'{k}: {w}')
make_coffee2('大杯', '拿铁')
make_coffee2('大杯', '拿铁', 糖='20g', 盐='20g')
make_coffee2('大杯', '拿铁', 糖='20g', 盐='20g', 辣椒='30g', 特殊要求='不要咖啡,多放糖')
输出结果:
<class 'dict'>
香喷喷的咖啡来了...
大小:大杯
风味:拿铁
<class 'dict'>
香喷喷的咖啡来了...
大小:大杯
风味:拿铁
糖: 20g
盐: 20g
<class 'dict'>
香喷喷的咖啡来了...
大小:大杯
风味:拿铁
糖: 20g
盐: 20g
辣椒: 30g
特殊要求: 不要咖啡,多放糖
我先打印了一下这个others
参数是何方神圣。原来它是一个字典。
代码应该还算清楚,就不多讲了。
讲个插曲:
“我在准备这个3分钟的时候,制作咖啡的第2个例子总是报错,害了我10分钟才找出原因。
是一个很低级的错误,在应该调用
make_coffee2()
的地方我少写了一个2,一直在调用make_coffee()
,所以一直报错。
这种低级错误,你曾经犯过吗?
评论0