浅析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简单文本处理的方法
Jul 10 Python
在Django的URLconf中进行函数导入的方法
Jul 18 Python
Windows上使用Python增加或删除权限的方法
Apr 24 Python
更换Django默认的模板引擎为jinja2的实现方法
May 28 Python
解决pandas read_csv 读取中文列标题文件报错的问题
Jun 15 Python
python直接获取API传递回来的参数方法
Dec 17 Python
基于OpenCV python3实现证件照换背景的方法
Mar 22 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
May 27 Python
将python安装信息加入注册表的示例
Nov 20 Python
python 的topk算法实例
Apr 02 Python
keras的三种模型实现与区别说明
Jul 03 Python
Python打包为exe详细教程
May 18 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 闭包特性在实际应用中的问题
2009/10/30 PHP
PHP 动态生成静态HTML页面示例代码
2014/01/15 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
javascript新手语法小结
2008/06/15 Javascript
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
javascript 基础篇4 window对象,DOM
2012/03/14 Javascript
将光标定位于输入框最右侧实现代码
2012/12/04 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
基于jQuery制作小图标上下滑动特效
2017/01/18 Javascript
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
2017/07/05 NodeJs
JS 实现分页打印功能
2018/05/16 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
2021/01/30 Javascript
vue给组件传递不同的值方法
2018/09/29 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
js中位数不足自动补位扩展padLeft、padRight实现代码
2020/04/06 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
2020/07/24 Javascript
python搜索包的路径的实现方法
2019/07/19 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
基于Python3.7.1无法导入Numpy的解决方式
2020/03/09 Python
python基于socket函数实现端口扫描
2020/05/28 Python
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
限量版运动鞋和街头服饰:TheDrop
2020/09/06 全球购物
新大陆软件面试题
2016/11/24 面试题
社区工作感言
2014/02/21 职场文书
数学教师个人工作总结
2015/02/06 职场文书
2015年电教工作总结
2015/05/26 职场文书
2015年暑期实践报告范文
2015/07/13 职场文书
军训结束新闻稿
2015/07/17 职场文书
超市主管竞聘书
2015/09/15 职场文书
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python
Pytest中skip skipif跳过用例详解
2021/06/30 Python
MySQL中varchar和char类型的区别
2021/11/17 MySQL