Python中函数调用时*和**的作用( 二 )
def f(a, *pargs, **kargs): print(a,pargs,kargs)f(1,2,3,x=4,y=5)1 (2, 3) {\u0026#39;x\u0026#39;: 4, \u0026#39;y\u0026#39;: 5}这个例子中,1按位置传给a,2和3收集到pargs位置的元组中,x和y放入kargs关键字词典中
2、如果*和**语法出现在函数调用中又会如何呢?他会解包参数的集合。
例如,我们在调用函数时能够使用*语法,在这种情况下,它与函数定义的意思相反,他会解包参数的集合,而不是创建参数的集合。例如我们可以通过一个元组给一个函数传递四个参数,并且让python将它们解包成不同的参数。def func(a,b,c,d): print(a,b,c,d)args = (1,2,3,4)func(*args)1 2 3 4相似的,在函数调用时,**会以键/值对的形式解包一个字典,使其成为独立的关键字参数。def func(a,b,c,d): print(a,b,c,d)kargs = {\u0026#39;a\u0026#39;:1, \u0026#39;b\u0026#39;:2, \u0026#39;c\u0026#39;:3, \u0026#39;d\u0026#39;:4}func(**kargs)1 2 3 4当然这种形式也是可以混合的,从左到右要以位置参数、元组解包、关键字参数、字典解包的顺序来进行def func(a,b,c,d,e,f): print(a,b,c,d,e,f)args = (2, 3)kargs = {\u0026#39;d\u0026#39;: 4, \u0026#39;e\u0026#39;: 5}func(1, *args, f=6, **kargs)1 2 3 4 5 6说了这些基本的知识,我们来看看一个实际应用的例子
这种支持任意参数形式的方法的一个应用点,就是实现对其他函数进行灵活调用。因为参数列表可以通过元组、字典形式传入,所以他支持运行时构建参数列表,这对于测试和计时其他函数非常方便。在下面的代码中,我们通过传递任何发送进来的参数来支持具有任意参数的任意函数:def tracer(func, *args, **kargs): print(\u0026#39;calling:\u0026#39;, func.__name__) return func(*args, **kargs)def func(a,b,c,d): return a+b+c+dprint(tracer(func,1,2,c=3,d=4))calling: func10很明显,这里在定义tracer函数时应用了收集任意参数的方法,在其中调用func函数时又利用了解包参数的方法。
关于数据科学更系统、更深入的探讨可进入我们的专栏《Python数据科学之路》:
酱油哥:来吧,一起踏上Python数据科学之路本专栏模仿美剧剧集编排分为五季,第一季:Python编程语言核心基础、第二季:Python数据分析基本工具、第三季:Python语言描述的数学基础、第四季:机器学习典型算法专题、第五季:实战热点深度应用。
推荐阅读
- 怎样成为一名合格的Python程序员?
- python 爬虫,咋获得输入验证码之后的搜索结果
- python的html5lib这个库咋使用啊我在网上也没有找到相关文档
- win7中本地连接跟无线网卡同时使用时是怎么样的模式
- 零基础入门学习啥语言好
- Python3.4和3.5区别大么
- python 中 def_():...... return _有啥作用
- 新互联网网站用Java还靠谱么对比Php,Python,Ruby的话
- 30岁男,创业失败转行学python,是否很晚?也不好找工作?
- Python 的开发速度比 C#.net 或 Vb.net 更快吗?
