对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 urls.py的三种配置写法实例详解
Apr 28 Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 Python
Python(Django)项目与Apache的管理交互的方法
May 16 Python
Python实现的多叉树寻找最短路径算法示例
Jul 30 Python
python使用socket实现的传输demo示例【基于TCP协议】
Sep 24 Python
用Python去除图像的黑色或白色背景实例
Dec 12 Python
Pytorch 实现focal_loss 多类别和二分类示例
Jan 14 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
Apr 20 Python
python的链表基础知识点
Sep 13 Python
python 基于UDP协议套接字通信的实现
Jan 22 Python
python中pymysql包操作数据库方法
Apr 19 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
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
详谈PHP文件目录基础操作
2014/11/11 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
非常实用的php验证码类
2016/05/15 PHP
php将文件夹打包成zip文件的简单实现方法
2016/10/04 PHP
PHP无限极分类函数的实现方法详解
2017/04/15 PHP
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
javascript日期处理函数,性能优化批处理
2015/09/06 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
浅谈 Vue v-model指令的实现原理
2017/06/08 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
vue自定义全局共用函数详解
2018/09/18 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
通过实例解析JavaScript for in及for of区别
2020/06/15 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
Python访问纯真IP数据库脚本分享
2015/06/29 Python
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
django启动uwsgi报错的解决方法
2018/04/08 Python
python得到一个excel的全部sheet标签值方法
2018/12/10 Python
关于PyTorch源码解读之torchvision.models
2019/08/17 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
Python如何省略括号方法详解
2020/03/21 Python
Python logging模块handlers用法详解
2020/08/14 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
Guess欧洲官网:美国服饰品牌
2019/08/06 全球购物
平面设计的岗位职责
2013/11/08 职场文书
委托公证书范本
2014/04/03 职场文书
家长评语怎么写
2014/12/30 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android