对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获取电脑硬件信息及状态的实现方法
Aug 29 Python
Python set集合类型操作总结
Nov 07 Python
一步步教你用Python实现2048小游戏
Jan 19 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
Nov 24 Python
python机器学习之决策树分类详解
Dec 20 Python
深入浅析Python传值与传址
Jul 10 Python
Flask框架WTForm表单用法示例
Jul 20 Python
Django REST 异常处理详解
Jul 15 Python
python获取系统内存占用信息的实例方法
Jul 17 Python
关于探究python中sys.argv时遇到的问题详解
Feb 23 Python
Python selenium的这三种等待方式一定要会!
Jun 10 Python
baselines示例程序train_cartpole.py的ImportError
May 20 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安全的URL字符串base64编码和解码
2014/06/19 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
2016/01/07 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
jQuery分组选择器用法实例
2014/12/23 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
使用React实现轮播效果组件示例代码
2016/09/05 Javascript
Bootstrap表单控件学习使用
2017/03/07 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
Vue开发之watch监听数组、对象、变量操作分析
2019/04/25 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
2019/12/27 Javascript
[01:07:19]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第一场
2018/04/06 DOTA
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
python求质数列表的例子
2019/11/24 Python
nginx+uwsgi+django环境搭建的方法步骤
2019/11/25 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
2020/04/10 Python
Python中常见的数制转换有哪些
2020/05/27 Python
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
家居设计专业个人自荐信范文
2013/11/26 职场文书
给全校老师的建议书
2014/03/13 职场文书
保险公司晨会主持词
2014/03/22 职场文书
中国梦演讲稿5分钟
2014/08/19 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
2015年酒店工作总结范文
2015/04/07 职场文书
小学中队活动总结
2015/05/11 职场文书
负责培养人意见
2015/06/05 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
Centos环境下Postgresql 安装配置及环境变量配置技巧
2021/05/18 PostgreSQL
Pandas 数据编码的十种方法
2022/04/20 Python