浅析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 随机数生成的代码的详细分析
May 15 Python
python中的列表推导浅析
Apr 26 Python
详解Python中的元组与逻辑运算符
Oct 13 Python
MySQL适配器PyMySQL详解
Sep 20 Python
Python实现通过继承覆盖方法示例
Jul 02 Python
win7+Python3.5下scrapy的安装方法
Jul 31 Python
python2与python3共存问题的解决方法
Sep 18 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 Python
mac使用python识别图形验证码功能
Jan 10 Python
python将dict中的unicode打印成中文实例
May 11 Python
Python Celery异步任务队列使用方法解析
Aug 10 Python
如何利用pycharm进行代码更新比较
Nov 04 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
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
php计算2个日期的差值函数分享
2015/02/02 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
2019/06/22 PHP
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
jQuery unbind 删除绑定事件详解
2016/05/24 Javascript
详解vue的数据binding绑定原理
2017/04/12 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
vue单页应用加百度统计代码(亲测有效)
2018/01/31 Javascript
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
js实现各浏览器全屏代码实例
2018/07/03 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
基于redis的小程序登录实现方法流程分析
2020/05/25 Javascript
Vue看了就会的8个小技巧
2021/01/21 Vue.js
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
Python编程实现二叉树及七种遍历方法详解
2017/06/02 Python
python调用java的jar包方法
2018/12/15 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
娱乐节目策划方案
2014/06/10 职场文书
幼儿老师求职信
2014/06/30 职场文书
四风自我剖析材料思想汇报
2014/10/01 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
网络销售员岗位职责
2015/04/11 职场文书
公司借条范本
2015/05/25 职场文书
Python 避免字典和元组的多重嵌套问题
2022/07/15 Python