对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生成随机MAC地址
Mar 10 Python
python实现将内容分行输出
Nov 05 Python
Python环境下搭建属于自己的pip源的教程
May 05 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
Jun 21 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
Python 2/3下处理cjk编码的zip文件的方法
Apr 26 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
Jun 21 Python
python的slice notation的特殊用法详解
Dec 27 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
使用Keras 实现查看model weights .h5 文件的内容
Jun 09 Python
Python常用模块函数代码汇总解析
Aug 31 Python
Python Matplotlib库实现画局部图
Nov 17 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
Linux下将excel数据导入到mssql数据库中的方法
2010/02/08 PHP
php cc攻击代码与防范方法
2012/10/18 PHP
PHP实现批量生成App各种尺寸Logo
2015/03/19 PHP
PHP实现的文件操作类及文件下载功能示例
2016/12/24 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
简单实用jquery版三级联动select示例
2013/07/04 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
JS验证全角与半角及相互转化的介绍
2017/05/18 Javascript
基于构造函数的五种继承方法小结
2017/07/27 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
2017/09/19 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
Element el-button 按钮组件的使用详解
2021/02/01 Javascript
python批量修改文件后缀示例代码分享
2013/12/24 Python
Django 响应数据response的返回源码详解
2019/08/06 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
2020/02/14 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
ASP.NET Core中的配置详解
2021/02/05 Python
HTML5标签大全
2016/11/23 HTML / CSS
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
AJAX的全称是什么
2012/11/06 面试题
最新奶茶店创业计划书
2014/01/25 职场文书
八年级数学教学反思
2014/01/31 职场文书
秋游活动策划方案
2014/02/16 职场文书
幼儿园中班开学寄语
2014/04/03 职场文书
三方股份合作协议书
2014/10/13 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
唐山大地震的观后感
2015/06/05 职场文书
用Python生成会跳舞的美女
2022/01/18 Python