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 相关文章推荐
CentOS中使用virtualenv搭建python3环境
Jun 08 Python
玩转python爬虫之cookie使用方法
Feb 17 Python
Python 使用SMTP发送邮件的代码小结
Sep 21 Python
在python中实现强制关闭线程的示例
Jan 22 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 Python
python set内置函数的具体使用
Jul 02 Python
pandas 时间格式转换的实现
Jul 06 Python
详解Django模版中加载静态文件配置方法
Jul 21 Python
python实现BP神经网络回归预测模型
Aug 09 Python
在python中logger setlevel没有生效的解决
Feb 21 Python
python 读取二进制 显示图片案例
Apr 24 Python
Django实现翻页的示例代码
May 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脚本的10个技巧(5)
2006/10/09 PHP
php empty函数 使用说明
2009/08/10 PHP
php中实现精确设置session过期时间的方法
2014/07/17 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
2019/09/16 PHP
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
javascript动态加载二
2012/08/22 Javascript
js中复制行和删除行的操作实例
2013/06/25 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
原生js编写设为首页兼容ie、火狐和谷歌
2014/06/05 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
小程序云开发如何实现图片上传及发表文字
2019/05/17 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
Vue 3自定义指令开发的相关总结
2021/01/29 Vue.js
python操作sqlite的CRUD实例分析
2015/05/08 Python
python修改操作系统时间的方法
2015/05/18 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
Pycharm 跳转回之前所在页面的操作
2021/02/05 Python
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
生物学学生自我评价
2014/01/17 职场文书
服装设计专业自荐信
2014/06/17 职场文书
交警作风整顿剖析材料
2014/10/11 职场文书
python中Matplotlib绘制直线的实例代码
2021/07/04 Python
「约定的梦幻岛」作画发布诺曼生日新绘
2022/03/21 日漫
Elasticsearch 基本查询和组合查询
2022/04/19 Python