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中线程问题的简单讲解
Apr 03 Python
Python 获得13位unix时间戳的方法
Oct 20 Python
基于Python __dict__与dir()的区别详解
Oct 30 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
CentOS7.3编译安装Python3.6.2的方法
Jan 22 Python
django数据库migrate失败的解决方法解析
Feb 08 Python
python如何获取当前文件夹下所有文件名详解
Jan 25 Python
Python3.8中使用f-strings调试
May 22 Python
Python 获取ftp服务器文件时间的方法
Jul 02 Python
Python3 翻转二叉树的实现
Sep 30 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
Nov 21 Python
pytorch 中nn.Dropout的使用说明
May 20 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中__destruct与register_shutdown_function执行的先后顺序问题
2014/10/17 PHP
PHP简单实现数字分页功能示例
2016/08/24 PHP
ThinkPHP框架实现数据增删改
2017/05/07 PHP
PHP数据分析引擎计算余弦相似度算法示例
2017/08/08 PHP
PHP实现的策略模式简单示例
2017/08/25 PHP
CentOS7编译安装php7.1的教程详解
2019/04/18 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
10个基于Jquery的幻灯片插件教程
2010/10/29 Javascript
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
ajax中get和post的说明及使用与区别
2012/12/23 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
AngularJS使用ng-repeat指令实现下拉框
2016/08/23 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
jQuery中DOM节点的删除方法总结(超全面)
2017/01/22 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
微信小程序使用modal组件弹出对话框功能示例
2017/11/29 Javascript
vue 组件的封装之基于axios的ajax请求方法
2018/08/11 Javascript
[06:23]2014DOTA2西雅图国际邀请赛 小组赛7月12日TOPPLAY
2014/07/12 DOTA
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
Python模块_PyLibTiff读取tif文件的实例
2020/01/13 Python
Python3变量与基本数据类型用法实例分析
2020/02/14 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
Python Opencv轮廓常用操作代码实例解析
2020/09/01 Python
python实现图像高斯金字塔的示例代码
2020/12/11 Python
卫校中专生个人自我评价
2013/09/19 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
2016先进集体事迹材料范文
2016/02/25 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP
react中props 的使用及进行限制的方法
2021/04/28 Javascript
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android