欢迎访问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(+ 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(),所以一直报错。

这种低级错误,你曾经犯过吗?

声明:本网站资源来源于网络收集,如有侵权,请联系站长进行删除处理。 分享目的仅供大家学习和交流,请不要用于商业用途,否则后果自负。本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解。本站资源售价只是赞助,收取费用仅维持本站的日常运营所需。反馈邮箱:1159995880@qq.com