对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中pygame模块用法实例
Oct 09 Python
Python的Flask框架中@app.route的用法教程
Mar 31 Python
Python制作爬虫采集小说
Oct 25 Python
python中文件变化监控示例(watchdog)
Oct 16 Python
python的staticmethod与classmethod实现实例代码
Feb 11 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
Jun 26 Python
python存储16bit和32bit图像的实例
Dec 05 Python
对Python实现简单的API接口实例讲解
Dec 10 Python
Python 分发包中添加额外文件的方法
Aug 16 Python
django model通过字典更新数据实例
Apr 01 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
Linux系统下升级pip的完整步骤
Jan 31 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动态创建Flash动画
2006/10/09 PHP
我的论坛源代码(八)
2006/10/09 PHP
php实现把数组按指定的个数分隔
2014/02/17 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
php编写简单的文章发布程序
2015/06/18 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
thinkphp3.2同时连接两个数据库的简单方法
2019/08/13 PHP
php项目中类的自动加载实例讲解
2019/09/12 PHP
解决Laravel 不能创建 migration 的问题
2019/10/09 PHP
JavaScript读取中文cookie时的乱码问题的解决方法
2009/10/14 Javascript
JS 遮照层实现代码
2010/03/31 Javascript
基于jquery实现的表格分页实现代码
2011/06/21 Javascript
常用jQuery选择器总结
2014/07/11 Javascript
javascript实现倒计时(精确到秒)
2015/06/26 Javascript
jquery实现滑屏大图定时收缩为小banner图片的广告代码
2015/09/02 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
Vue键盘事件用法总结
2017/04/18 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
详解Vue整合axios的实例代码
2017/06/21 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
layui 弹出层回调获取弹出层数据的例子
2019/09/02 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
9种python web 程序的部署方式小结
2014/06/30 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
说说如何遍历Python列表的方法示例
2019/02/11 Python
关于Pytorch的MLP模块实现方式
2020/01/07 Python
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
英文版区域经理求职信
2013/10/23 职场文书
专科应届生求职信
2013/11/24 职场文书
工厂门卫岗位职责
2013/11/25 职场文书
高一物理教学反思
2014/01/24 职场文书
我的梦想演讲稿500字
2014/08/21 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python
win10如何快速切换窗口 win10切换窗口快捷键分享
2022/07/23 数码科技