浅析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爬虫之打包生成exe文件
Nov 06 Python
Python读取环境变量的方法和自定义类分享
Nov 22 Python
Python元组及文件核心对象类型详解
Feb 11 Python
flask-restful使用总结
Dec 04 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
Django 表单模型选择框如何使用分组
May 16 Python
Djang的model创建的字段和参数详解
Jul 27 Python
python随机数分布random均匀分布实例
Nov 27 Python
Python全面分析系统的时域特性和频率域特性
Feb 26 Python
python中使用input()函数获取用户输入值方式
May 03 Python
利于python脚本编写可视化nmap和masscan的方法
Dec 29 Python
详解使用scrapy进行模拟登陆三种方式
Feb 21 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
mayfish 数据入库验证代码
2010/04/30 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
document.designMode的功能与使用方法介绍
2007/11/22 Javascript
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
2010/04/01 Javascript
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
2011/01/06 Javascript
javascript中的注释使用与注意事项小结
2011/09/20 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
用客户端js实现带省略号的分页
2013/04/27 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
bootstrap警告框使用方法解析
2017/01/13 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
jQuery Validate表单验证插件实现代码
2017/06/08 jQuery
JS判断数组那点事
2017/10/10 Javascript
layer弹出子iframe层父子页面传值的实现方法
2018/11/22 Javascript
JS利用prototype给类添加方法操作详解
2019/06/21 Javascript
python通过wxPython打开一个音频文件并播放的方法
2015/03/25 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
Python面向对象之类的定义与继承用法示例
2019/01/14 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
Python获取时间范围内日期列表和周列表的函数
2019/08/05 Python
修复iPhone的safari浏览器上submit按钮圆角bug
2012/12/24 HTML / CSS
用CSS3写的模仿iPhone中的返回按钮
2015/04/04 HTML / CSS
柯基袜:Corgi Socks
2017/01/26 全球购物
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
DJI全球:DJI Global
2021/03/15 全球购物
爱牙日活动总结
2014/08/29 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
司机个人年终总结
2015/03/03 职场文书
村党总支部公开承诺书2016
2016/03/25 职场文书
vue Element-ui表格实现树形结构表格
2021/06/07 Vue.js
LeetCode189轮转数组python示例
2022/08/05 Python