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 13 Python
Python爬虫抓取手机APP的传输数据
Jan 22 Python
详解django中使用定时任务的方法
Sep 27 Python
对pandas写入读取h5文件的方法详解
Dec 28 Python
python opencv判断图像是否为空的实例
Jan 26 Python
Python检查ping终端的方法
Jan 26 Python
使用python绘制二元函数图像的实例
Feb 12 Python
pandas计数 value_counts()的使用
Jun 24 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 Python
python tkinter组件使用详解
Sep 16 Python
Python 如何操作 SQLite 数据库
Aug 17 Python
Python 处理日期时间的Arrow库使用
Aug 18 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.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
6种php上传图片重命名的方法实例
2013/11/04 PHP
PHP命名空间简单用法示例
2018/12/28 PHP
javascript下高性能字符串连接StringBuffer类
2010/08/16 Javascript
再论Javascript的类继承
2011/03/05 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
js通过地址栏给action传值(中文乱码全是问号)
2013/05/02 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
基于iframe实现类似于ajax的页面无刷新
2014/05/31 Javascript
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
2015/11/15 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
详解Angular.js中$http拦截器的介绍及使用
2017/07/04 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
js实现动态改变radio状态的方法
2018/02/28 Javascript
对于防止按钮重复点击的尝试详解
2019/04/22 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
在vue-cli中引入lodash.js并使用详解
2019/11/13 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
[03:46]DOTA2英雄基础教程 维萨吉
2013/12/11 DOTA
[06:06]2018DOTA2亚洲邀请赛主赛事第四日战况回顾 全明星赛欢乐上演
2018/04/07 DOTA
浅谈Tensorflow模型的保存与恢复加载
2018/04/26 Python
python语言是免费还是收费的?
2020/06/15 Python
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
小学校园活动策划
2014/01/30 职场文书
幼师自我鉴定
2014/02/01 职场文书
商铺消防安全责任书
2014/07/29 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
股东合作协议书模板2篇
2019/11/05 职场文书
Nginx源码编译安装过程记录
2021/11/17 Servers
Golang jwt身份认证
2022/04/20 Golang