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 24 Python
用python一行代码得到数组中某个元素的个数方法
Jan 28 Python
Pycharm如何打断点的方法步骤
Jun 13 Python
python支持多线程的爬虫实例
Dec 21 Python
python PIL/cv2/base64相互转换实例
Jan 09 Python
Python range与enumerate函数区别解析
Feb 28 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
Mar 08 Python
Python中求对数方法总结
Mar 10 Python
python 画条形图(柱状图)实例
Apr 24 Python
在CentOS7下安装Python3教程解析
Jul 09 Python
Jupyter Notebook安装及使用方法解析
Nov 12 Python
使用pd.merge表连接出现多余行的问题解决
Jun 16 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
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
PHP扩展CURL的用法详解
2014/06/20 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
微信小程序之数据双向绑定与数据操作
2017/05/12 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
vue-lazyload图片延迟加载插件的实例讲解
2018/02/09 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
vue如何实现动态加载脚本
2020/02/05 Javascript
Vue自定义表单内容检查rules实例
2020/10/30 Javascript
[02:39]DOTA2英雄基础教程 极限穿梭编织者
2013/12/05 DOTA
Python  连接字符串(join %)
2008/09/06 Python
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
使用Turtle画正螺旋线的方法
2017/09/22 Python
python无序链表删除重复项的方法
2020/01/17 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
详解python的变量缓存机制
2021/01/24 Python
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
大学优秀班主任事迹材料
2014/05/02 职场文书
汽车专业求职信
2014/06/05 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
武夷山导游词
2015/02/03 职场文书
销售员岗位职责
2015/02/10 职场文书
2016年会开场白台词
2015/06/01 职场文书
2016年教师寒假学习心得体会
2015/10/09 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
Python 处理表格进行成绩排序的操作代码
2021/07/26 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python