对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利用正则表达式搜索单词示例代码
Sep 24 Python
浅析python的优势和不足之处
Nov 20 Python
Django中Middleware中的函数详解
Jul 18 Python
pytorch中的embedding词向量的使用方法
Aug 18 Python
Series和DataFrame使用简单入门
Nov 13 Python
python redis 批量设置过期key过程解析
Nov 26 Python
Python 面向对象之类class和对象基本用法示例
Feb 02 Python
Python API len函数操作过程解析
Mar 05 Python
解决python调用自己文件函数/执行函数找不到包问题
Jun 01 Python
opencv 图像加法与图像融合的实现代码
Jul 08 Python
python温度转换华氏温度实现代码
Dec 06 Python
Python获取字典中某个key的value
Apr 13 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
输出控制类
2006/10/09 PHP
yii2 commands模式以及配置crontab定时任务的方法
2017/08/19 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
2012/08/14 Javascript
JavaScript数值转换的三种方式总结
2014/07/31 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
2014/12/18 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
JavaScript在控件上添加倒计时功能的实现代码
2017/07/04 Javascript
ztree简介_动力节点Java学院整理
2017/07/19 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
js实现文字头像的生成代码
2020/03/07 Javascript
Python3中的真除和Floor除法用法分析
2016/03/16 Python
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
2016/05/17 Python
基于python内置函数与匿名函数详解
2018/01/09 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
2018/07/10 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
2019/08/09 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
Python 测试框架unittest和pytest的优劣
2020/09/26 Python
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
解析html5 canvas实现背景鼠标连线动态效果代码
2019/06/17 HTML / CSS
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
自荐信如何“自荐”
2013/10/24 职场文书
计算机专业毕业生自我鉴定
2014/01/16 职场文书
小松树教学反思
2014/02/11 职场文书
慈善献爱心倡议书
2015/04/27 职场文书
复活读书笔记
2015/06/29 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
nginx容器方式反向代理实战
2022/04/18 Servers