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 while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
python中datetime模块中strftime/strptime函数的使用
Jul 03 Python
NumPy 数学函数及代数运算的实现代码
Jul 18 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
Python使用sqlalchemy模块连接数据库操作示例
Mar 13 Python
OpenCV 模板匹配
Jul 10 Python
Django模型修改及数据迁移实现解析
Aug 01 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
Aug 14 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 Python
Python模拟登录之滑块验证码的破解(实例代码)
Nov 18 Python
Selenium元素定位的30种方式(史上最全)
May 11 Python
Python绘画好看的星空图
Mar 17 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 smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
PHP Memcached应用实现代码
2010/02/08 PHP
解析php中curl_multi的应用
2013/07/17 PHP
php 判断网页是否是utf8编码的方法
2014/06/06 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
php 读取输出其他文件的实现方法
2016/07/26 PHP
PHP生成短网址的思路以及实现方法的详解
2019/03/25 PHP
IE6下js通过css隐藏select的一个bug
2010/08/16 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
Node.js Express 框架 POST方法详解
2017/01/23 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
vue 导出文件,携带请求头token操作
2020/09/10 Javascript
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
Python算法之栈(stack)的实现
2014/08/18 Python
在Django中限制已登录用户的访问的方法
2015/07/23 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
详解Python sys.argv使用方法
2019/05/10 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
django框架两个使用模板实例
2019/12/11 Python
Python正则表达式如何匹配中文
2020/05/27 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
Grid 宫格常用布局的实现
2020/01/10 HTML / CSS
类的核心特性有哪些
2014/01/01 面试题
服装机修工岗位职责
2013/12/26 职场文书
协议书怎么写
2014/04/21 职场文书
董事长秘书工作职责
2014/06/10 职场文书
会计学专业求职信
2014/07/17 职场文书
领导欢迎词范文
2015/01/26 职场文书
课程设计感想范文
2015/08/11 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
Python作用域和名称空间的详细介绍
2022/04/13 Python