Python入门之函数式开发
2016-07-20 00:00
183 查看
摘要: Python函数式开发
在了解函数式开发之前,我们先了解一下什么是高阶函数。高阶函数有以下属性:
1.变量可以指向函数
2.函数的参数可以接收变量
3.一个函数可以接收另一个函数作为参数
4.能接收函数作参数的函数就是高阶函数
示例为:
我先将a指向了abs函数,然后在自定义的函数add中,我们把a当做了参数,也就是把abs函数当做了参数。
下面给大家介绍几个Python内置的高阶函数:
map()函数:它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。示例为:
可以看得出,map的功能就是让list里面的每一个值都执行一遍f函数,从而变成一个新的list。
reduce()函数:reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。示例为:
reduce就是先拿list中的1,2来作为参数调用f函数,得到的结果和3一起作为参数调用f函数,得到的结果再与4一起作为参数来调用f函数,以此类推。所以该段代码就相当于输出一下1+2+3+4+5。
P.S.如果对谷歌的大数据处理有一定了解,或者读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clusters”(这是谷歌家的东西,所以想阅读原文的朋友,记得翻墙)的朋友,应该是很容易理解上述这两个高阶函数的。
filter()函数:filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。示例为:
filter就是拿list里的每个元素去执行is_not_empty函数,如果返回值为true,则保留,如果返回值为false,则将其去除。
sorted()函数:sorted()函数可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。示例为:
从上可以看出,当sorted只传进了一个list,那么将对其进行顺序排序。如果想进行逆序排序,可以自定义函数,然后将其当做参数传进sorted里面。
讲到这里,函数式开发到底是什么呢?我的理解的话,就是这种高度抽象的编程范式。它允许把函数本身作为参数传入另一个函数,还允许返回一个函数!而且函数式编程本身并不包含变量,也就是说,当输入确定时,那么输出也就确定了,这种纯函数编程,我们称之为没有副作用。而普通的函数,由于变量的存在,当输入确定时,可能输出也是有所不同的,这种函数就是有副作用的。
在了解函数式开发之前,我们先了解一下什么是高阶函数。高阶函数有以下属性:
1.变量可以指向函数
2.函数的参数可以接收变量
3.一个函数可以接收另一个函数作为参数
4.能接收函数作参数的函数就是高阶函数
示例为:
def add(x,y,f): return f(x) + f(y) a = abs print add(-5,5,a) #结果为10
我先将a指向了abs函数,然后在自定义的函数add中,我们把a当做了参数,也就是把abs函数当做了参数。
下面给大家介绍几个Python内置的高阶函数:
map()函数:它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。示例为:
def f(x): return x*x print 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+y print 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的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clusters”(这是谷歌家的东西,所以想阅读原文的朋友,记得翻墙)的朋友,应该是很容易理解上述这两个高阶函数的。
filter()函数:filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。示例为:
def is_not_empty(s): return s and len(s.strip())>0 print 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<y): return 1 return 0 print sorted([2,7,3,0,16],reversed_cmp) #输出值为:[16, 7, 3, 2, 0]
从上可以看出,当sorted只传进了一个list,那么将对其进行顺序排序。如果想进行逆序排序,可以自定义函数,然后将其当做参数传进sorted里面。
讲到这里,函数式开发到底是什么呢?我的理解的话,就是这种高度抽象的编程范式。它允许把函数本身作为参数传入另一个函数,还允许返回一个函数!而且函数式编程本身并不包含变量,也就是说,当输入确定时,那么输出也就确定了,这种纯函数编程,我们称之为没有副作用。而普通的函数,由于变量的存在,当输入确定时,可能输出也是有所不同的,这种函数就是有副作用的。
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法