对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下自己编写web框架的一些要点
Apr 29 Python
浅谈Python中copy()方法的使用
May 21 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
Feb 01 Python
Python通过调用mysql存储过程实现更新数据功能示例
Apr 03 Python
python 删除指定时间间隔之前的文件实例
Apr 24 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
Jun 13 Python
详解Python 协程的详细用法使用和例子
Jun 15 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
python的常见矩阵运算(小结)
Aug 07 Python
tensorflow 分类损失函数使用小记
Feb 18 Python
python中字符串的编码与解码详析
Dec 03 Python
Python 把两层列表展开平铺成一层(5种实现方式)
Apr 07 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 和 MySQL 基础教程(一)
2006/10/09 PHP
PHP 柱状图实现代码
2009/12/04 PHP
PHP测试程序运行时间的类
2012/02/05 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
2013/07/15 PHP
js作用域及作用域链概念理解及使用
2013/04/15 Javascript
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
jQuery获得包含margin的outerWidth和outerHeight的方法
2015/03/25 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
2017/01/22 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
2020/04/17 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
[53:10]完美世界DOTA2联赛决赛日 FTD vs GXR 第二场 11.08
2020/11/11 DOTA
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
wxPython之解决闪烁的问题
2018/01/15 Python
Python中sort和sorted函数代码解析
2018/01/25 Python
Python解决八皇后问题示例
2018/04/22 Python
python绘制圆柱体的方法
2018/07/02 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
2018/08/16 Python
python爬虫神器Pyppeteer入门及使用
2019/07/13 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
2019/11/22 Python
python numpy数组中的复制知识解析
2020/02/03 Python
keras-siamese用自己的数据集实现详解
2020/06/10 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
详解HTML5中的标签
2015/06/19 HTML / CSS
留学自荐信写作方法
2014/01/27 职场文书
省优秀教师事迹材料
2014/01/30 职场文书
《欢乐的泼水节》教学反思
2014/04/22 职场文书
销售辞职信范文
2015/03/02 职场文书
python实现的web监控系统
2021/04/27 Python
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android