浅析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程序员易犯的错误
Dec 15 Python
python实现人脸识别代码
Nov 08 Python
基于python中pygame模块的Linux下安装过程(详解)
Nov 09 Python
python ddt数据驱动最简实例代码
Feb 22 Python
Python数据类型之Set集合实例详解
May 07 Python
全面了解django的缓存机制及使用方法
Jul 22 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
Aug 05 Python
python+tifffile之tiff文件读写方式
Jan 13 Python
django自带的权限管理Permission用法说明
May 13 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
Jun 01 Python
运行Python编写的程序方法实例
Oct 21 Python
Python激活Anaconda环境变量的详细步骤
Jun 08 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
一个颜色轮换的简单例子
2006/10/09 PHP
Excel数据导入Mysql数据库的实现代码
2008/06/05 PHP
php将图片文件转换成二进制输出的方法
2015/06/10 PHP
PHP实现验证码校验功能
2017/11/16 PHP
TextArea 控件的最大长度问题(js json)
2009/12/16 Javascript
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
js弹出层之1:JQuery.Boxy (二)
2011/10/06 Javascript
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
Jquery多选框互相内容交换的实例代码
2013/07/04 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
javascript每日必学之继承
2016/02/23 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
2016/12/03 Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
2017/08/03 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
vue-cli中的webpack配置详解
2017/09/25 Javascript
vue中的计算属性实例详解
2018/09/19 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
Python的多态性实例分析
2015/07/07 Python
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
中学生自我鉴定
2014/02/04 职场文书
师范毕业生求职信
2014/07/11 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
Python3 类型标注支持操作
2021/06/02 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python