对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通过函数属性实现全局变量的方法
May 16 Python
详解Swift中属性的声明与作用
Jun 30 Python
python如何使用unittest测试接口
Apr 04 Python
Python应用库大全总结
May 30 Python
如何用Python做一个微信机器人自动拉群
Jul 03 Python
用Python配平化学方程式的方法
Jul 20 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
Feb 18 Python
Python实现aes加密解密多种方法解析
May 15 Python
python/golang 删除链表中的元素
Sep 14 Python
Django配置跨域并开发测试接口
Nov 04 Python
基于Django集成CAS实现流程详解
Nov 28 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
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
php基于session锁防止阻塞请求的方法分析
2017/08/07 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
2019/03/14 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
javascript 拖放效果实现代码
2010/01/22 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
2013/08/13 Javascript
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
PHP+mysql+Highcharts生成饼状图
2015/05/04 Javascript
javascript html实现网页版日历代码
2016/03/08 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
JS公共小方法之判断对象是否为domElement的实例
2016/11/25 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
vue axios登录请求拦截器
2018/04/02 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
vue中 数字相加为字串转化为数值的例子
2019/11/07 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
用Python制作简单的钢琴程序的教程
2015/04/01 Python
Python实现把回车符\r\n转换成\n
2015/04/23 Python
python九九乘法表的实例
2017/09/26 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
Django实现基于类的分页功能
2019/10/31 Python
Python无损压缩图片的示例代码
2020/08/06 Python
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
盛大二次面试题
2016/11/18 面试题
旅游管理专业个人求职信范文
2013/12/24 职场文书
幼儿园儿童节主持词
2014/03/21 职场文书
小学生寒假家长评语
2014/04/16 职场文书
毕业生找工作求职信
2014/08/05 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
商超业务员岗位职责
2015/02/13 职场文书
Minikube搭建Kubernetes集群
2022/03/31 Servers