对Python强大的可变参数传递机制详解

作者:LisPythoniC 时间:2021-06-23 02:54:09 

今天模拟定义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)
>>>

来源:https://www.cnblogs.com/xiangnan/p/3387342.html

标签:Python,参数,传递
0
投稿

猜你喜欢

  • 在linux下实现 python 监控usb设备信号

    2022-04-18 15:29:24
  • PHP排序二叉树基本功能实现方法示例

    2023-07-10 04:45:53
  • 解析:校对确定 较为复杂的一些特殊情况

    2008-12-17 16:54:00
  • SQL Server 查询分析器快捷键集合

    2007-08-17 09:42:00
  • 用javascript实现给出的盒子的序列是否可连为一矩型

    2023-09-09 22:34:02
  • 使用url_helper简化Python中Django框架的url配置教程

    2023-01-10 14:44:51
  • python字典排序实例详解

    2021-10-12 12:12:02
  • PHP7新特性之抽象语法树(AST)带来的变化详解

    2023-07-18 14:42:53
  • 使用css2.1实现多重背景、多重边框效果[译]

    2010-08-23 16:32:00
  • 学习 YUI3 中的沙箱机制

    2010-04-12 12:52:00
  • PHP中Too few arguments to function的问题及解决

    2023-06-04 21:15:55
  • python MultipartEncoder传输zip文件实例

    2022-04-20 07:22:57
  • js验证表单(form)中多选框(checkbox)值

    2008-03-18 13:39:00
  • asp按关键字查询XML的代码

    2011-04-21 11:10:00
  • 得到元素真实的背景颜色的函数

    2008-05-20 12:04:00
  • 全面了解CSS内置颜色(color)值

    2008-11-19 12:26:00
  • Go语言HTTPServer开发的六种方式小结

    2023-06-22 21:48:21
  • 简写一个的lightbox显示隐藏层效果(兼容)

    2010-07-23 20:02:00
  • select @@identity的应用(得到刚插入数据的ID)

    2009-09-10 11:24:00
  • Golang中字符串(string)与字节数组([]byte)一行代码互转实例

    2023-09-17 14:37:07
  • asp之家 网络编程 m.aspxhome.com