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 相关文章推荐
把项目从Python2.x移植到Python3.x的经验总结
Apr 20 Python
Python的gevent框架的入门教程
Apr 29 Python
Python编程之基于概率论的分类方法:朴素贝叶斯
Nov 11 Python
python语音识别实践之百度语音API
Aug 30 Python
selenium + python 获取table数据的示例讲解
Oct 13 Python
Python 从列表中取值和取索引的方法
Dec 25 Python
Python中文件的写入读取以及附加文字方法
Jan 23 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
Jun 27 Python
Python的Tkinter点击按钮触发事件的例子
Jul 19 Python
python:动态路由的Flask程序代码
Nov 22 Python
Python模块future用法原理详解
Jan 20 Python
windows下的pycharm安装及其设置中文菜单
Apr 23 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
php5 and xml示例
2006/11/22 PHP
PHP中IP地址与整型数字互相转换详解
2014/08/20 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
php数组指针操作详解
2017/02/14 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
解释&&和||在javascript中的另类用法
2014/07/28 Javascript
控制台报错object is not a function的解决方法
2014/08/24 Javascript
JavaScript函数模式详解
2014/11/07 Javascript
浅谈jQuery中replace()方法
2015/05/13 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
浅谈JavaScript的全局变量与局部变量
2016/06/10 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
jQuery实现推拉门效果
2020/10/19 jQuery
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
python计算圆周率pi的方法
2015/07/11 Python
python 删除大文件中的某一行(最有效率的方法)
2017/08/19 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
python和opencv实现抠图
2018/07/18 Python
python微信公众号之关注公众号自动回复
2018/10/25 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
python打开使用的方法
2019/09/30 Python
django使用JWT保存用户登录信息
2020/04/22 Python
Jupyter notebook如何修改平台字体
2020/05/13 Python
世界上最大的各式箱包网络零售店:eBag
2016/07/21 全球购物
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
大学生学习计划书
2014/09/15 职场文书
基层党组织整改方案
2014/10/25 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书
OpenCV 图像梯度的实现方法
2021/07/25 Python
关于Python中进度条的六个实用技巧分享
2022/04/05 Python