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 28 Python
Python常用的文件及文件路径、目录操作方法汇总介绍
May 21 Python
R语言 vs Python对比:数据分析哪家强?
Nov 17 Python
Python实现PS滤镜特效之扇形变换效果示例
Jan 26 Python
python爬虫获取淘宝天猫商品详细参数
Jun 23 Python
Python函数装饰器常见使用方法实例详解
Mar 30 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
Tensorflow分批量读取数据教程
Feb 07 Python
python实现查找所有程序的安装信息
Feb 18 Python
python GUI计算器的实现
Oct 09 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
May 28 Python
Python中npy和mat文件的保存与读取
Apr 24 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使用curl抓取qq空间的访客信息示例
2014/02/28 PHP
PHP开发微信支付的代码分享
2014/05/25 PHP
PHP整合PayPal支付
2015/06/11 PHP
php实用代码片段整理
2016/11/12 PHP
PHP实现cookie跨域session共享的方法分析
2019/08/23 PHP
prototype 学习笔记整理
2009/07/17 Javascript
js setattribute批量设置css样式
2009/11/26 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
js字符串转换成xml对象并使用技巧解读
2013/04/18 Javascript
JavaScript实现关键字高亮功能
2014/11/12 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
js实现选项卡内容切换以及折叠和展开效果【推荐】
2017/01/08 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
2017/11/30 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
[03:08]迎霜节狂欢!2018年迎霜节珍藏Ⅰ一览
2018/12/25 DOTA
Python Web框架Flask信号机制(signals)介绍
2015/01/01 Python
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
2019/10/25 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
CSS3的新特性介绍
2008/10/31 HTML / CSS
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
html5页面结构_动力节点Java学院整理
2017/07/10 HTML / CSS
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
个人求职信范文分享
2013/12/13 职场文书
小学生作文评语
2014/04/18 职场文书
运动会口号大全
2014/06/07 职场文书
文明单位创建材料
2014/12/24 职场文书
JavaScript 对象创建的3种方法
2021/11/17 Javascript
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang