对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 相关文章推荐
python通过urllib2爬网页上种子下载示例
Feb 24 Python
python模拟鼠标拖动操作的方法
Mar 11 Python
用Python的SimPy库简化复杂的编程模型的介绍
Apr 13 Python
详解Python的Django框架中的通用视图
May 04 Python
python Django批量导入数据
Mar 25 Python
Python+OpenCV采集本地摄像头的视频
Apr 25 Python
用python打印1~20的整数实例讲解
Jul 01 Python
python selenium 执行完毕关闭chromedriver进程示例
Nov 15 Python
Python完全识别验证码自动登录实例详解
Nov 24 Python
PyCharm 在Windows的有用快捷键详解
Apr 07 Python
python中format函数如何使用
Jun 22 Python
python pymysql库的常用操作
Oct 16 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
PHP获取http请求的头信息实现步骤
2012/12/16 PHP
php防注入及开发安全详细解析
2013/08/09 PHP
PHP Session 变量的使用方法详解与实例代码
2013/09/11 PHP
php图片添加文字水印实现代码
2016/03/15 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
2018/01/15 PHP
javascript第一课
2007/02/27 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
2013/01/23 Javascript
js的Prototype属性解释及常用方法
2014/05/08 Javascript
Nodejs关于gzip/deflate压缩详解
2015/03/04 NodeJs
JavaScript中使用Object.prototype.toString判断是否为数组
2015/04/01 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
2015/06/11 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
详解windows下vue-cli及webpack 构建网站(三)使用组件
2017/06/17 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
详解Python中的各种函数的使用
2015/05/24 Python
python3设计模式之简单工厂模式
2017/10/17 Python
python实现学生管理系统
2018/01/11 Python
使用python将图片格式转换为ico格式的示例
2018/10/22 Python
python Pillow图像处理方法汇总
2019/10/16 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
医院护士专业个人的求职信
2013/12/09 职场文书
学生上课说话检讨书
2014/10/25 职场文书
2014年底工作总结
2014/12/15 职场文书
2015年林业工作总结
2015/05/14 职场文书
爱国电影观后感
2015/06/19 职场文书