对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连接oracle数据库实例
Oct 17 Python
解析Python中的变量、引用、拷贝和作用域的问题
Apr 07 Python
Pyhthon中使用compileall模块编译源文件为pyc文件
Apr 28 Python
简单介绍Python中的readline()方法的使用
May 24 Python
对Python 网络设备巡检脚本的实例讲解
Apr 22 Python
对numpy中的transpose和swapaxes函数详解
Aug 02 Python
python3.6使用tkinter实现弹跳小球游戏
May 09 Python
python 实现返回一个列表中出现次数最多的元素方法
Jun 11 Python
PyQt5 加载图片和文本文件的实例
Jun 14 Python
PyTorch之图像和Tensor填充的实例
Aug 18 Python
150行Python代码实现带界面的数独游戏
Apr 04 Python
python 在threading中如何处理主进程和子线程的关系
Apr 25 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
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
javascript 写类方式之四
2009/07/05 Javascript
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
JS设置下拉列表框当前所选值的方法
2015/12/22 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
微信JSSDK调用微信扫一扫功能的方法
2017/07/25 Javascript
js实现移动端轮播图效果
2020/12/09 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
实例分析js事件循环机制
2017/12/13 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
解决在Vue中使用axios用form表单出现的问题
2019/10/30 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
如何搭建pytorch环境的方法步骤
2020/05/06 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
Foot Locker意大利官网:全球领先的运动鞋和服装零售商
2017/05/30 全球购物
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
北卡罗来纳州豪华家具和家居装饰店:Carolina Rustica
2018/10/30 全球购物
iPad和Surface Pro蓝牙键盘:Brydge
2018/11/10 全球购物
澳大利亚著名的纺织品品牌:Canningvale
2020/05/05 全球购物
工程质量承诺书
2014/03/27 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
高速铁道技术专业求职信
2014/08/09 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS
纯html+css实现打字效果
2021/08/02 HTML / CSS
Java实现给Word文件添加文字水印
2022/02/15 Java/Android