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


Posted in Python onJune 13, 2019

今天模拟定义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 相关文章推荐
python3.0 字典key排序
Dec 24 Python
python查询mysql中文乱码问题
Nov 09 Python
简单介绍利用TK在Python下进行GUI编程的教程
Apr 13 Python
Python实现字典的key和values的交换
Aug 04 Python
Python实现合并两个列表的方法分析
May 28 Python
python如果快速判断数字奇数偶数
Nov 13 Python
Python实现读取并写入Excel文件过程解析
May 27 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
Jun 06 Python
python BeautifulSoup库的安装与使用
Dec 17 Python
tensorflow与numpy的版本兼容性问题的解决
Jan 08 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 Python
Python+Matplotlib+LaTeX玩转数学公式
Feb 24 Python
python 通过可变参数计算n个数的乘积方法
Jun 13 #Python
python 多线程对post请求服务器测试并发的方法
Jun 13 #Python
Python任意字符串转16, 32, 64进制的方法
Jun 12 #Python
使用python制作一个为hex文件增加版本号的脚本实例
Jun 12 #Python
Python hexstring-list-str之间的转换方法
Jun 12 #Python
对python3.4 字符串转16进制的实例详解
Jun 12 #Python
python版DDOS攻击脚本
Jun 12 #Python
You might like
[EPIC] Larva vs Flash ZvT @ Crossing Field [2017-10-09]
2020/03/17 星际争霸
PHP漏洞全解(详细介绍)
2012/11/13 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
向fckeditor编辑器插入指定代码的方法
2007/05/25 Javascript
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
jquery仿搜索自动联想功能代码
2014/05/23 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
js实现楼层效果的简单实例
2016/07/15 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
2021/02/05 Javascript
Python字典操作简明总结
2015/04/13 Python
实现python版本的按任意键继续/退出
2016/09/26 Python
python Web开发你要理解的WSGI & uwsgi详解
2018/08/01 Python
keras tensorflow 实现在python下多进程运行
2020/02/06 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
应届生法律顾问求职信
2013/11/19 职场文书
师范生的个人求职信范文
2014/01/04 职场文书
淘宝活动策划方案
2014/02/06 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
商场客服专员岗位职责
2014/06/13 职场文书
幼儿园社区活动总结
2014/07/07 职场文书
担保书格式
2015/01/20 职场文书
校友回访母校寄语
2015/02/26 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
2016高考寄语或鼓励的话语
2015/12/04 职场文书
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏