浅析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 实现堆排序算法代码
Jun 05 Python
python实现爬虫下载漫画示例
Feb 16 Python
python中使用urllib2获取http请求状态码的代码例子
Jul 07 Python
python通过cookie模拟已登录状态的初步研究
Nov 09 Python
pygame加载中文名mp3文件出现error
Mar 31 Python
python使用matplotlib绘图时图例显示问题的解决
Apr 27 Python
Python操作使用MySQL数据库的实例代码
May 25 Python
python支付宝支付示例详解
Aug 22 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
基于Python共轭梯度法与最速下降法之间的对比
Apr 02 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
Jun 11 Python
python-图片流传输的思路及示例(url转换二维码)
Dec 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
PHP执行zip与rar解压缩方法实现代码
2010/12/05 PHP
使用URL传输SESSION信息
2015/07/14 PHP
php计算税后工资的方法
2015/07/28 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
jquery及js实现动态加载js文件的方法
2016/01/21 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
Express与NodeJs创建服务器的两种方法
2017/02/06 NodeJs
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
实现Vue的markdown文档可以在线运行的方法示例
2018/12/11 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
js+canvas实现刮刮奖功能
2020/09/13 Javascript
[14:25]教你分分钟做大人:主宰(HEROS)
2014/12/08 DOTA
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
mac安装scrapy并创建项目的实例讲解
2018/06/13 Python
Python编程中flask的简介与简单使用
2018/12/28 Python
Python实现点阵字体读取与转换的方法
2019/01/29 Python
Python骚操作之动态定义函数
2019/03/26 Python
解决pytorch 模型复制的一些问题
2021/03/03 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
canvas简易绘图的实现(海绵宝宝篇)
2018/07/04 HTML / CSS
super关键字的用法
2012/04/10 面试题
介绍一下XMLHttpRequest对象
2012/02/12 面试题
银行委托书范本
2014/04/04 职场文书
vue引入Excel表格插件的方法
2021/04/28 Vue.js
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript
MySQL创建管理HASH分区
2022/04/13 MySQL
mysql中关键词exists的用法实例详解
2022/06/10 MySQL