python进阶教程之函数对象(函数也是对象)


Posted in Python onAugust 30, 2014

秉承着一切皆对象的理念,我们再次回头来看函数(function)。函数也是一个对象,具有属性(可以使用dir()查询)。作为对象,它还可以赋值给其它对象名,或者作为参数传递。

lambda函数

在展开之前,我们先提一下lambda函数。可以利用lambda函数的语法,定义函数。lambda例子如下:

func = lambda x,y: x + y

print func(3,4)

lambda生成一个函数对象。该函数参数为x,y,返回值为x+y。函数对象赋给func。func的调用与正常函数无异。

以上定义可以写成以下形式:

def func(x, y):

    return x + y

函数作为参数传递

函数可以作为一个对象,进行参数传递。函数名(比如func)即该对象。比如说:

def test(f, a, b):

    print 'test'

    print f(a, b)
test(func, 3, 5)

test函数的第一个参数f就是一个函数对象。将func传递给f,test中的f()就拥有了func()的功能。

我们因此可以提高程序的灵活性。可以使用上面的test函数,带入不同的函数参数。比如:

test((lambda x,y: x**2 + y), 6, 9)

map()函数

map()是Python的内置函数。它的第一个参数是一个函数对象。

re = map((lambda x: x+3),[1,3,5,6])

这里,map()有两个参数,一个是lambda所定义的函数对象,一个是包含有多个元素的表。map()的功能是将函数对象依次作用于表的每一个元素,每次作用的结果储存于返回的表re中。map通过读入的函数(这里是lambda函数)来操作数据(这里“数据”是表中的每一个元素,“操作”是对每个数据加3)。

在Python 3.X中,map()的返回值是一个循环对象。可以利用list()函数,将该循环对象转换成表。

如果作为参数的函数对象有多个参数,可使用下面的方式,向map()传递函数参数的多个参数:

re = map((lambda x,y: x+y),[1,2,3],[6,7,9])

map()将每次从两个表中分别取出一个元素,带入lambda所定义的函数。

filter()函数

filter函数的第一个参数也是一个函数对象。它也是将作为参数的函数对象作用于多个元素。如果函数对象返回的是True,则该次的元素被储存于返回的表中。filter通过读入的函数来筛选数据。同样,在Python 3.X中,filter返回的不是表,而是循环对象。

filter函数的使用如下例:

def func(a):

    if a > 100:

        return True

    else:

        return False
print filter(func,[10,56,101,500])

reduce()函数

reduce函数的第一个参数也是函数,但有一个要求,就是这个函数自身能接收两个参数。reduce可以累进地将函数作用于各个参数。如下例:

print reduce((lambda x,y: x+y),[1,2,5,7,9])

reduce的第一个参数是lambda函数,它接收两个参数x,y, 返回x+y。

reduce将表中的前两个元素(1和2)传递给lambda函数,得到3。该返回值(3)将作为lambda函数的第一个参数,而表中的下一个元素(5)作为lambda函数的第二个参数,进行下一次的对lambda函数的调用,得到8。依次调用lambda函数,每次lambda函数的第一个参数是上一次运算结果,而第二个参数为表中的下一个元素,直到表中没有剩余元素。

上面例子,相当于(((1+2)+5)+7)+9

根据mmufhy的提醒: reduce()函数在3.0里面不能直接用的,它被定义在了functools包里面,需要引入包,见评论区。

总结

函数是一个对象

用lambda定义函数

map()

filter()

reduce()

Python 相关文章推荐
Python算法应用实战之栈详解
Feb 04 Python
Python利用itchat对微信中好友数据实现简单分析的方法
Nov 21 Python
python实现合并两个排序的链表
Mar 03 Python
Django中在xadmin中集成DjangoUeditor过程详解
Jul 24 Python
python函数参数(必须参数、可变参数、关键字参数)
Aug 16 Python
Django接收自定义http header过程详解
Aug 23 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
Jan 21 Python
python2和python3哪个使用率高
Jun 23 Python
python三引号如何输入
Jul 06 Python
Python 测试框架unittest和pytest的优劣
Sep 26 Python
python和opencv构建运动检测器的实现
Mar 03 Python
python 指定源路径来解决import问题的操作
Mar 04 Python
python进阶教程之循环对象
Aug 30 #Python
python进阶教程之循环相关函数range、enumerate、zip
Aug 30 #Python
python进阶教程之函数参数的多种传递方法
Aug 30 #Python
python进阶教程之模块(module)介绍
Aug 30 #Python
Python中的闭包实例详解
Aug 29 #Python
python进阶教程之文本文件的读取和写入
Aug 29 #Python
Python中__call__用法实例
Aug 29 #Python
You might like
作为PHP程序员应该了解MongoDB的五件事
2013/06/03 PHP
php使用Cookie控制访问授权的方法
2015/01/21 PHP
PHP实现的购物车类实例
2015/06/17 PHP
简单谈谈PHP vs Node.js
2015/07/17 PHP
php函数mkdir实现递归创建层级目录
2016/10/27 PHP
jQuery中siblings()方法用法实例
2015/01/08 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
jQuery判断一个元素是否可见的方法
2015/06/05 Javascript
浏览器中url存储的JavaScript实现
2015/07/07 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
Angular.js基础学习之初始化
2017/03/10 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
ES7之Async/await的使用详解
2019/03/28 Javascript
js作用域和作用域链及预解析
2019/04/11 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
用jQuery实现抽奖程序
2020/04/12 jQuery
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
对于Python的Django框架部署的一些建议
2015/04/09 Python
python中的装饰器详解
2015/04/13 Python
python中enumerate函数用法实例分析
2015/05/20 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
python实现图片彩色转化为素描
2019/01/15 Python
python多进程间通信代码实例
2019/09/30 Python
Python高级特性之闭包与装饰器实例详解
2019/11/19 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
pandas中ix的使用详细讲解
2020/03/09 Python
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
自我评价个人范文
2013/12/16 职场文书
策划创业计划书
2014/02/06 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
班级班风口号大全
2015/12/25 职场文书
react 路由Link配置详解
2021/11/11 Javascript