对Python强大的可变参数传递机制详解
2019-11-04 18:06
1671 查看
今天模拟定义map函数.写着写着就发现Python可变长度参数的机制真是灵活而强大.
假设有一个元组t,包含n个成员:
t=(arg1,...,argn)
而一个函数f恰好能接受n个参数:
f(arg1,...,argn)
f(t)这种做法显然是错的,那么如何把t的各成员作为独立的参数传给f,以便达到f(arg1,...,argn)的效果?
我一开始想到的是很原始的解法,先把t的各个成员变为字符串的形式,再用英文逗号把它们串联起来,形成一个"标准参数字符串":
str_t=(str(x) for x in t) str_args=",".join(str_t)
str_args成了字符串"arg1,...,argn",这样,
eval('%s(%s)'%(f.__name__,str_args))
看起来就相当于:
f(arg1,...,argn)
老版本:
def imap(func,arr,*arrs): allarrs=(arr,)+arrs args=[] for i in range(len(arr)): member=[] for ar in allarrs: member.append(str(ar[i])) args.append(member) return (eval('%s(%s)'%(func.__name__,','.join(member))) for member in args) print list(imap(float,(1,2,3,4))) print list(imap((lambda x,y,z:x+y+z),(1,1,1,1),(1,1,1,1),(1,1,1,1)))
一运行发现,对于命名函数float可以正常运作,但对于匿名函数lambda就不行了.显然eval思路的局限就在这里.
我突然想起,直接f(*t) 就可以达到目的了!于是,新版本:
def imap(func,arr,*arrs): allarrs=(arr,)+arrs return (func(*(ar[i] for ar in allarrs)) for i in range(len(arr))) print list(imap(float,(1,2,3,4))) print list(imap((lambda x,y,z:x+y+z),(1,1,1,1),(1,1,1,1),(1,1,1,1)))
结果:
>>> [1.0, 2.0, 3.0, 4.0] [3, 3, 3, 3]
而且function(*args_tuple)的强大机制在于,args_tuple不一定是元组,任意可迭代对象均可.列表,字典,生成器等.
>>> def function(*iterable): print iterable >>> function(*(1,2,3)) (1, 2, 3) >>> function(*[1,2,3]) (1, 2, 3) >>> function(*{1:'',2:''}) (1, 2) >>> function(*(i for i in range(4))) (0, 1, 2, 3) >>>
以上这篇对Python强大的可变参数传递机制详解就是小编分享给大家的全部内容了,希望能给大家一个参考
您可能感兴趣的文章:
相关文章推荐
- 详解Python函数可变参数定义及其参数传递方式
- Python函数可变参数定义及其参数传递方式实例详解
- Python函数可变参数定义及其参数传递方式实例详解
- 方法详解、方法参数传递机制、形参个数可变
- Python函数可变参数定义及其参数传递方式详解
- C语言中的参数传递机制详解
- python中的*和**参数传递机制
- 一文详解Python中的*可变参数与**关键字参数
- 【Python】构造函数、析构函数与可变参数传递
- 详解Python的三种可变参数
- Python函数可变参数*args及**kwargs详解
- python 可变参数传递
- python中的函数参数定义和可变参数详解
- Python函数中参数是传递值还是引用详解
- python 函数传递可变参数的用法
- Python语言中函数的参数传递机制
- Python中method的参数传递详解
- Python中函数的参数传递与可变长参数
- 关于Python参数传递时,传递可变对象(mutable)和不可变更对象(immutable)的误区
- Python关键字参数与非关键字参数(可变参数)详解