浅析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脚本在Linux下实现部分Bash Shell的教程
Apr 17 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 Python
TensorFlow的权值更新方法
Jun 14 Python
Python键盘输入转换为列表的实例
Jun 23 Python
python绘制中国大陆人口热力图
Nov 07 Python
Python面向对象进阶学习
May 21 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
Oct 28 Python
Python 实现数组相减示例
Dec 27 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
May 25 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
Nov 02 Python
Django celery异步任务实现代码示例
Nov 26 Python
Python进程间的通信之语法学习
Apr 11 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
长波有什么东西
2021/03/01 无线电
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
2015/07/01 PHP
[原创]ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法
2015/10/10 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
浅谈javascript语法和定时函数
2015/05/03 Javascript
jquery实现叠层3D文字特效代码分享
2015/08/21 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
JavaScript中0和&quot;&quot;比较引发的问题
2016/05/26 Javascript
微信小程序 require机制详解及实例代码
2016/12/14 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
vue-cli3脚手架的配置及使用教程
2018/08/28 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
layui的select联动实现代码
2019/09/28 Javascript
vue data对象重新赋值无效(未更改)的解决方式
2020/07/24 Javascript
Python实现优先级队列结构的方法详解
2016/06/02 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
Python处理CSV与List的转换方法
2018/04/19 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
python实现嵌套列表平铺的两种方法
2018/11/08 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
2019/08/23 Python
Windows下python3安装tkinter的问题及解决方法
2020/01/06 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
2019/01/18 HTML / CSS
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
学校节能减排方案
2014/06/13 职场文书
课程设计的心得体会
2014/09/03 职场文书
个人租房协议书
2014/11/28 职场文书
驳回起诉裁定书
2015/05/19 职场文书
大学生社会实践感想
2015/08/11 职场文书
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis
试了下Golang实现try catch的方法
2021/07/01 Golang
我去timi了,一起去timi是什么意思?
2022/04/13 杂记