博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python入门之函数式开发
阅读量:5895 次
发布时间:2019-06-19

本文共 1696 字,大约阅读时间需要 5 分钟。

hot3.png

在了解函数式开发之前,我们先了解一下什么是高阶函数。高阶函数有以下属性:

1.变量可以指向函数

2.函数的参数可以接收变量
3.一个函数可以接收另一个函数作为参数
4.能接收函数作参数的函数就是高阶函数

示例为:

def add(x,y,f):    return f(x) + f(y)a = absprint add(-5,5,a)#结果为10

我先将a指向了abs函数,然后在自定义的函数add中,我们把a当做了参数,也就是把abs函数当做了参数。

 

下面给大家介绍几个Python内置的高阶函数:

map()函数:它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。示例为:

def f(x):    return x*xprint map(f,[1,2,3,4])#输出值为:[1, 4, 9, 16]

可以看得出,map的功能就是让list里面的每一个值都执行一遍f函数,从而变成一个新的list。

 

reduce()函数:reduce()函数接收的参数和 map()类似,一个函数 f一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。示例为:

def f(x,y):    return x+yprint reduce(f,[1,2,3,4,5])#输出值为:15

reduce就是先拿list中的1,2来作为参数调用f函数,得到的结果和3一起作为参数调用f函数,得到的结果再与4一起作为参数来调用f函数,以此类推。所以该段代码就相当于输出一下1+2+3+4+5。

P.S.如果对谷歌的大数据处理有一定了解,或者读过Google的那篇大名鼎鼎的论文“”(这是谷歌家的东西,所以想阅读原文的朋友,记得翻墙)的朋友,应该是很容易理解上述这两个高阶函数的。

 

filter()函数:filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。示例为:

def is_not_empty(s):    return s and len(s.strip())>0print filter(is_not_empty,['test',None,'','str','   ','END'])#输出值为:['test', 'str', 'END']

filter就是拿list里的每个元素去执行is_not_empty函数,如果返回值为true,则保留,如果返回值为false,则将其去除。

 

sorted()函数:sorted()函数可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。示例为:

print sorted([2,7,3,0,16])#输出值为:[0, 2, 3, 7, 16]def reversed_cmp(x,y):    if(x>y):        return -1    if(x

从上可以看出,当sorted只传进了一个list,那么将对其进行顺序排序。如果想进行逆序排序,可以自定义函数,然后将其当做参数传进sorted里面。

讲到这里,函数式开发到底是什么呢?我的理解的话,就是这种高度抽象的编程范式。它允许把函数本身作为参数传入另一个函数,还允许返回一个函数!而且函数式编程本身并不包含变量,也就是说,当输入确定时,那么输出也就确定了,这种纯函数编程,我们称之为没有副作用。而普通的函数,由于变量的存在,当输入确定时,可能输出也是有所不同的,这种函数就是有副作用的。

转载于:https://my.oschina.net/lonelycode/blog/715263

你可能感兴趣的文章
程序员经常遇到的几个问题!
查看>>
Pytext简介:facebook的基于PyTorch的NLP框架
查看>>
[SQL server 2005]之一配置自动管理数据库和日志大小
查看>>
css 溢出部分隐藏
查看>>
show ip bgp neighbors 信息解读
查看>>
强大的PDF转换控件ActivePDF WebGrabber
查看>>
数字设计
查看>>
RHEL7 挂载U盘
查看>>
Linux安装FTP
查看>>
ios开发入门- WebView使用
查看>>
mysql系列之多实例2----基于多配置文件
查看>>
Blender的插件开发-Operator操作器(算子)
查看>>
Qt学习笔记三:QT项目的代码结构
查看>>
在 RHEL 5.5 下配置 Cacti 0.8.7g
查看>>
十大 Wordpress Hack 技巧
查看>>
让 SCOM 2007 R2 使用 SQL Server 2008 R2 数据库
查看>>
我的友情链接
查看>>
无盘启动esxi物理主机及加载配置
查看>>
Java InetSocketAddress 类说明
查看>>
linux用户密码策略测试
查看>>