0
点赞
收藏
分享

微信扫一扫

python3教程:函数的可变输入参量

通常我们在python中定义一个函数的时候,需要给出明确的函数输入参量,比如对于一个数学函数z=f(x,y)就表示,z是关于x和y的一个函数。但是如果对于未知参量的函数,比如函数形式可以是z=f(x,y),但也可以是z=f(x,y,m,n,i,j,k),在不确定入参的时候,就可以采用python中的*args和**kwargs参数。

*args参数的使用方法

首先用一个例子来说明一下*args的基本用法,这个参量可以替代函数括号中的固定变量,从数据结构上说是一个可变长度的tuple:

def fargs(*args):
s = 0
for variable in args:
s += float(variable)
return s

if __name__ == '__main__':
import sys
args_string = ''
for number in sys.argv[1:]: # 从命令行获取任意长度的参数
args_string += number
args_string += ','
s = eval('fargs({})'.format(args_string)) # 直接用字符串执行函数
print ('The sum of {} is: {}'.format(args_string, s))

在这个案例中,我们不仅介绍了*args的使用方法,也利用了命令行参数获取和eval函数这两个python中常见的使用技巧。其中关于获取命令行参数的使用技巧,可以参考这一篇博客。上述代码的执行效果如下所示:

[dechin@dechin-manjaro args]$ python3 test_args.py 1 2 3 3.14
The sum of 1,2,3,3.14, is: 9.14
[dechin@dechin-manjaro args]$ python3 test_args.py 1 2 3 3.14 0.86
The sum of 1,2,3,3.14,0.86, is: 10.0

这里给了两个不同长度的输入,通过函数fargs完成了求和的工作,并且输入的长度是可变的。

**kwargs的用法

kwargs的用法是类似于上面介绍的*args的,区别在于kwargs本质上是传入了一个“字典”,或者称之为一个键值对。需要注意的是,这里每一个键值对的数据格式都是tuple类型的,而不是python中的字典类型,所以上面说到“字典”时加了引号。参考示例如下:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''

def fkwargs(**kwargs):
s = 0
print ('Key values input: ',kwargs)
for key, variable in kwargs.items():
s += float(variable)
return s

if __name__ == '__main__':
import sys
args_string = ''
for number in sys.argv[1:]:
args_string += number
args_string += ','
s = eval('fkwargs({})'.format(args_string))
print ('The sum of {} is: {}'.format(args_string, s))

这里的场景我们设置为一个买菜购物计算总价格的函数,输入的参数是每一个购买的物品及其价格,最后的输出是购买总价格,测试结果如下所示:

[dechin@dechin-manjaro args]$ python3 test_kwargs.py egg=20 beaf=60 milk=10
Key values input: {'egg': 20, 'beaf': 60, 'milk': 10}
The sum of egg=20,beaf=60,milk=10, is: 90.0
[dechin@dechin-manjaro args]$ python3 test_kwargs.py egg=20 water=1
Key values input: {'egg': 20, 'water': 1}
The sum of egg=20,water=1, is: 21.0

总结

为了使得输入参数的可扩展性更好,python中自带了args和kwargs两种方法,可以用于表示一个tuple类型的可变长度入参。其中args是一系列的一元变量的输入,kwargs是一系列键值对的输入,可以认为是一个二元变量的输入。虽然这两种方案也都可以用自行实现的tuple来替代,但是直接使用这两种定义会节省很多自定义可变入参的繁琐。


举报

相关推荐

0 条评论