浅析Python函数式编程


Posted in Python onOctober 06, 2018

Functional Programming,函数式编程。Python对函数式编程提供部分支持。对于纯函数编程,对任一函数,只要输入是确定的,输出就是确定的,可称之为无副作用。

一、高阶函数

1、变量指向函数

我们知道函数的计算结果可以赋值给变量,例如x = abs(-5)。

同理,变量也可以指向函数,例如f = abs。

如果一个变量指向了一个函数,那我们直接调用abs(x)与执行f(x)返回的结果是完全相同。

2、函数名也是变量

我们也可以把函数名看成是一个变量,例如abs()函数。执行语句abs=-5,之后调用abs(-5)就会报错,因为此时abs这个变量已经不指向绝对值函数了,而是指向一个整数-5。

3、函数作为形参

既然变量可以指向函数,函数也可以充当变量,那么一个函数就可以接收另外一个函数作为它自己的形式参数,即实现高阶函数。例如:

>>> def add(x , y , f ): # 把函数作为参数传入。

...   return f(x) + f(y)

>>> add (-5,-2,abs)

7

二、函数式编程的内建函数

1、map(func,seq)

语法:map(func,seq),接收两个参数,一个是函数func,一个是可迭代对象。

作用:将传入的func函数循环作用于seq序列的每个元素上,并返回新的可迭代对象。

注意:map()函数返回的是一个<map object>,我们可以使用list()函数将所获得的结果以list形式返回。

举个栗子:用map()实现f(x)=x*x

>>> def f(x):

...   return x*x

...

>>> map(f,[1,2,3,4,5])

<map object at 0x0327F670>

>>> list(map(f,[1,2,3,4,5]))   # 传入的函数f作用于序列的每个元素调并用list()

[1, 4, 9, 16, 25]

当然还可以使用其他方法实现:

exp1:list( map((lambda x:x*x),[1,2,3,4,5]))

exp2:[x*x for x in [1,2,3,4,5]]

2、reduce(func,list)

语法:reduce(func,list),必须接受两个参数。

作用:把func函数作用在list序列上[x1,x2,x3,...]。取出序列的头两个元素x1和x2,作用于func,取的一个单一的值,例如a,再将a与序列的下一个元素x3做func运算,依此反复。其效果就相当于reduce(f,x1,x2,x3)=f(f(x1,x2),x3)

注意:使用reduce(),必须导入模块from functools import reduce

大家可以自己找个栗子玩玩哈~~~

3、filter()

语法:filter(func,[序列]),接收一个“过滤”函数,和一个序列。返回的是一个Iterator可迭代对象。

作用:按照func规则过滤序列,filter()把传入的函数func依此作用于每个元素,然后根据返回值TrueorFalse,来保留为True的对应元素。

注意:跟map()类似,filter()返回的是一个可迭代对象,故需要使用list()来查看所获得结果并返回list类型。

举个栗子:在一个list中,删除偶数,保留奇数。

>>> def is_odd(n):

...   return n % 2 == 1 # 返回0(false) 或1(True)

...

>>> list( filter(is_odd,[1,2,3,4,5,6,7,8,9]) )

[1, 3, 5, 7, 9]
Python 相关文章推荐
python格式化字符串实例总结
Sep 28 Python
python 根据正则表达式提取指定的内容实例详解
Dec 04 Python
Pycharm学习教程(3) 代码运行调试
May 03 Python
使用python对excle和json互相转换的示例
Oct 23 Python
Python使用POP3和SMTP协议收发邮件的示例代码
Apr 16 Python
使用Python实现跳帧截取视频帧
May 31 Python
PyQt5 窗口切换与自定义对话框的实例
Jun 20 Python
Django中信号signals的简单使用方法
Jul 04 Python
python scatter函数用法实例详解
Feb 11 Python
python实现图像全景拼接
Mar 27 Python
python在一个范围内取随机数的简单实例
Aug 16 Python
matplotlib更改窗口图标的方法示例
Feb 03 Python
Python实现iOS自动化打包详解步骤
Oct 03 #Python
Python中GIL的使用详解
Oct 03 #Python
Python线程同步的实现代码
Oct 03 #Python
详解通过API管理或定制开发ECS实例
Sep 30 #Python
Python 使用类写装饰器的小技巧
Sep 30 #Python
浅谈django三种缓存模式的使用及注意点
Sep 30 #Python
使用Python实现租车计费系统的两种方法
Sep 29 #Python
You might like
php格式化json函数示例代码
2016/05/12 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
toString()一个会自动调用的方法
2010/02/08 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
javascript写的一个模拟阅读小说的程序
2014/04/04 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
jQuery判断多个input file 都不能为空的例子
2015/06/23 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
2018/10/28 Javascript
Angular2 自定义表单验证器的实现方法
2018/12/14 Javascript
JS中call()和apply()的功能及用法实例分析
2019/06/28 Javascript
html2canvas属性和使用方法以及如何使用html2canvas将HTML内容写入Canvas生成图片
2020/01/12 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
Python中bisect的用法
2014/09/23 Python
python 数据的清理行为实例详解
2017/07/12 Python
python实现k-means聚类算法
2018/02/23 Python
Python全局锁中如何合理运用多线程(多进程)
2019/11/06 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
2019/12/09 Python
python异常处理和日志处理方式
2019/12/24 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
Python编写单元测试代码实例
2020/09/10 Python
英国著名音像制品和图书游戏购物网站:Zavvi
2016/08/04 全球购物
Turnbull & Asser官网:英国皇室御用的顶级定制衬衫
2019/01/31 全球购物
网络安全方面的面试题
2015/11/04 面试题
会计助理的岗位职责
2013/11/29 职场文书
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
小学英语教学反思
2014/01/30 职场文书
八一建军节演讲稿
2014/09/10 职场文书
2014年仓库工作总结
2014/11/20 职场文书
windows系统搭建WEB服务器详细教程
2022/08/05 Servers