对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基于twisted实现简单的web服务器
Sep 29 Python
跟老齐学Python之Python文档
Oct 10 Python
浅析Python中的多重继承
Apr 28 Python
Python使用CMD模块更优雅的运行脚本
May 11 Python
Python入门学习之字符串与比较运算符
Oct 12 Python
简单介绍使用Python解析并修改XML文档的方法
Oct 15 Python
python复制文件到指定目录的实例
Apr 27 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
May 06 Python
使用pytorch实现可视化中间层的结果
Dec 30 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
Jan 20 Python
Python爬虫教程之利用正则表达式匹配网页内容
Dec 08 Python
python基础之类属性和实例属性
Oct 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
一步一步学习PHP(4) php 函数 补充2
2010/02/15 PHP
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
PHP常用技巧总结(附函数代码)
2012/02/04 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
JavaScript delete 属性的使用
2009/10/08 Javascript
关于js datetime的那点事
2011/11/15 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
JavaScript通过代码调用Flash显示的方法
2016/02/02 Javascript
JavaScript实现的MD5算法完整实例
2016/02/02 Javascript
获取JS中网页各种高宽与位置的方法总结
2016/07/27 Javascript
区别JavaScript函数声明与变量声明
2018/09/12 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
解决vue组件中click事件失效的问题
2019/11/09 Javascript
node创建Vue项目步骤详解
2020/03/06 Javascript
[01:18]DOTA2超级联赛专访hanci ForLove淘汰感言曝光
2013/06/04 DOTA
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
python3中set(集合)的语法总结分享
2017/03/24 Python
python对日志进行处理的实例代码
2018/10/06 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
用python-webdriver实现自动填表的示例代码
2021/01/13 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
canvas简易绘图的实现(海绵宝宝篇)
2018/07/04 HTML / CSS
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
大学生家政服务项目创业计划书
2014/01/30 职场文书
淘宝客服工作职责
2014/07/11 职场文书
小学生民族团结演讲稿
2014/08/27 职场文书
党的群众路线教育实践活动心得体会范文
2014/11/05 职场文书
小学科学课教学反思
2016/02/23 职场文书
PHP命令行与定时任务
2021/04/01 PHP
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript
基于Redis的List实现特价商品列表功能
2021/08/30 Redis