Python学习(26):Python函数式编程
转自 http://www.cnblogs.com/BeginMan/p/3509985.html
前言
《core python programming 2》说:
Python不大可能会成为一种函数式编程语言,但它支持许多有价值的函数式编程语言构建。
然后就开始介绍lambda与四种内建函数。 对于新手来说,就有点迷惑了,到底什么是函数式编程了?? 于是google如下:
函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念。wiki
我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数式编程的第一型。在面向对象编程中,我们把对象传来传去,那在函数式编程中,我们要做的是把函数传来传去,而这个,说成术语,我们把他叫做高阶函数。飞林沙
在飞林沙的一篇博客中(函数式编程扫盲篇),我们探求高阶函数:
该文说:
在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:
- 接受一个或多个函数作为输入
- 输出一个函数
重点:
在函数式编程中,函数是基本单位,是第一型,他几乎被用作一切,包括最简单的计算,甚至连变量都被计算所取代。在函数式编程中,变量只是一个名称,而不是一个存储单元,这是函数式编程与传统的命令式编程最典型的不同之处。
在上面的代码中,我们可以简写如下:
lis = [1,2,-3,4,-46,0]
print map(lambda x:0 if x<0 else x, lis)
该文又介绍了函数式编程与递归,递归是函数式编程的一个重要的概念,循环可以没有,但是递归对于函数式编程却是不可或缺的。
递归其实就是将大问题无限地分解,直到问题足够小。 而递归与循环在编程模型和思维模型上最大的区别则在于:
循环是在描述我们该如何地去解决问题。
递归是在描述这个问题的定义。
学习
阮一峰的网络日志中说:也许继"面向对象编程"之后,"函数式编程"会成为下一个编程的主流范式(paradigm)。
并且总结了函数式编程具有五个鲜明的特点。:
- 函数是"第一等公民"
- 只用"表达式",不用"语句"
- 没有"副作用"
- 不修改状态
- 引用透明
意义如下:
- 代码简洁,开发快速
函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。
- 接近自然语言,易于理解
- 更方便的代码管理
- 易于"并发编程" 函数式编程不需要考虑"死锁"(deadlock),因为它不修改变量,所以根本不存在"锁"线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,部署"并发编程"(concurrency)。
5.代码的热升级
函数式编程没有副作用,只要保证接口不变,内部实现是外部无关的。所以,可以在运行状态下直接升级代码
Python下函数式编程
在理解了上面的文字后,不难发现前言部分所言的Python不大可能会成为一种函数式编程语言,但它支持许多有价值的函数式编程语言构建。
因为python一切皆对象的原则,但是python也提供了函数式编程的支持,就如函数式语言Lisp兴起之后各大热门编程语言都凑热闹纷纷提供对函数式编程的支持一样,Python当然也会分得一杯羹啊。
那下面就学习Python体现函数式编程的方面吧:
方面1:lambda表达式
体现原理就是python允许lambda关键字创建匿名函数,所谓匿名就是python不会创建名称空间,lambda表达式返回可调用的函数对象,这些都符合函数式编程的思想。
方面2:函数式编程的内建函数:apply()、filter()、map()、reduce()
它们都会将函数作为参数。这里重点学习后面三个。
filter(func,seq):
调用一个布尔类型的函数func来迭代遍历每一个seq中的元素,返回一个是func返回值为ture的元素的序列。
示例如下:
当然还可以重构如下,更加简洁:
# 重构
from random import randint as r
print [i for i in [r(1, 99) for j in range(10)] if i%2]
map(func, seq1[,seq2...]):
将函数func作用于给定序列的每一个元素,并用一个列表来提供返回值;如果func为None,func表现为一个身份函数,返回一个含有每个序列中元素集合的n个元祖的列表。
一个简单的例子:
# map 针对一个序列
print map(lambda a:a+2, [4,5,6])
# [6, 7, 8]
# 重构
print [i+2 for i in [4,5,6]]
#map 针对多个序列
#在第一次调用时,map()会将每个序列对应位置的元素捆绑到一个元祖中,将func函数作用到map()上
#当map()已经完成执行时,将元祖的结果返回到mapped_seq映射的,最终以整体返回的序列上。
print map(lambda a,b:a+b, [1,2,3],[4,5,6])
# [5, 7, 9]
# print map(lambda a,b:a+b, [1,2,3],[4,5])
# 出错:TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
#None与map()
print map(None,[1,2,3],[4,5,6]) #[(1, 4), (2, 5), (3, 6)]
#重构
print zip([1,2,3], [4,5,6])
#[(1, 4), (2, 5), (3, 6)]
对于上述的zip:zip([seql, ...])接受一系列可迭代对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。 可看这篇博客Python零碎知识(2):强大的zip
print zip([1,2],[1,2,3,4,5]) #[(1, 1), (2, 2)]
print map(None,[1,2],[1,2,3,4,5]) # [(1, 1), (2, 2), (None, 3), (None, 4), (None, 5)]
reduce(func,seq[,init]):
理解方式可以用下面Python代码实现:
"""纯Python模拟reduce()"""
def Myreduce(bin_func,seq,init=None):
Iseq = list(seq)
if init is None:
res = Iseq.pop(0)
else:
res = init
for obj in Iseq:
res = bin_func(res,obj)
return res
print Myreduce(lambda x,y:x+y, [i for i in range(10)]) #45
print Myreduce(lambda x,y:x+y, [i for i in range(10)],100) #145
"""reduce()"""
print reduce(lambda x,y:x+y,[i for i in range(10)]) #45
print reduce(lambda x,y:x+y,[i for i in range(10)],100) #145
其工作方式如下图:
参考资料:
Python学习(26):Python函数式编程的更多相关文章
- python学习笔记011——函数式编程
1 函数式编程 面向对象 ,面向过程 ,函数式编程 侧重函数的作用,注重函数结果的传递 函数可以被赋值,也可以接受其他的值 2 函数式编程特点 1.函数是一等公民 与其他变量一样,可以赋值和被赋值,可 ...
- Python学习笔记之函数式编程
python中的高阶函数 高阶函数就是 变量名指向函数,下面代码中的变量abs其实是一个函数,返回数字的绝对值,如abs(-10) 返回 10 def add(x,y,f): return f(x) ...
- python学习笔记(六) 函数式编程
一 函数对象 函数同样可以作为对象复制给一个变量,如下: f = abs; print(f(-10)) f = 'abs'; print(f) def add(a,b,f): return f(a) ...
- python学习22之函数式编程
'''''''''1.高阶函数:将函数作为参数传递到另一个函数中,作为这个函数的参数,这样的方式叫高阶函数(1)map:两个参数,一个是函数,一个是iterator,将函数依次作用于Iterator中 ...
- python学习笔记1 -- 函数式编程之高阶函数 sorted排序
python提供了很强大的内置排序函数,妈妈再也不担心我不会写冒泡排序了呀,sorted函数就是这个排序函数,该函数参数准确的说有四个,sorted(参数1,参数2,参数3,参数4). 参数1 是需要 ...
- python学习笔记1 -- 函数式编程之高阶函数 map 和reduce
我用我自己,就是高阶函数,直接表现就是函数可以作为另一个函数的参数,也可以作为返回值 首先一个知识点是 函数的表现形式,印象中的是def fw(参数)这种方式定义一个函数 python有很多的内置函 ...
- Python学习笔记6 函数式编程_20170619
廖雪峰python3学习笔记: # 高阶函数 将函数作为参数传入,这样的函数就是高阶函数(有点像C++的函数指针) def add(x, y): return x+y def mins(x, y): ...
- python学习笔记1 -- 函数式编程之高阶函数 使用函数作为返回值
使用函数作为返回值,看起来就很高端有木有,前面了解过函数名本身就是一个变量,就比如abs()函数,abs只是变量名,而abs()才是函数调用,那么我们如果把ads这个变量作为返回值返回会怎么样呢,这就 ...
- python学习笔记1 -- 函数式编程之高阶函数 filter
filter 函数用于过滤序列,与map 和reduce函数类似,作为高阶函数,他们也是同样的使用方法,filter(参数1, 参数2),参数1是一个函数,而参数2是一个序列. filter的作用是根 ...
- Python学习-26.Python中的三角函数
Python中的三角函数位于math模块内. 引入模块: import math 输出pi import math print(math.pi) 得:3.141592653589793 math模块内 ...
随机推荐
- C++多线程中调用python api函数
错误场景:一直等待全局锁. 解决方法: 一.首先定义一个封装类,主要是保证PyGILState_Ensure, PyGILState_Release配对使用,而且这个类是可以嵌套使用的. #inclu ...
- 移动端微信应用开发总结(function ajax meta)
关键字:document function ajax jquery html5 meta 微信应用开发时,特意把各个容易混淆的知识点和要点,梳理后记录下来,也分享给各位.有问题还请多指正. 一 文档载 ...
- php 文件上传类,功能相当齐全,留作开发中备用吧。
收藏一个经典好用的php 文件上传类,功能相当齐全,留作开发中备用吧. 好东西,大家都喜欢,才是真的好,哈哈!!! <?php /** * 文件上传类 */ class upload ...
- 如何允许你的应用移动到SD卡?(转至http://blog.csdn.net/feng88724/article/details/6946670)
我们在使用Android手机时发现,有的程序允许被移动到SD卡,而有的不行?这是为什么呢? 因为在Android 2.2版之后, Android应用才被允许移动到SD卡中.而在此之前开发的应用,全部没 ...
- 工作所用的日常 Git 命令
几乎每个开发人员都在使用 Git,当然很可能是 GitHub.但大多数开发者大概有 99% 的时间只是使用这三个命令: #使用命令git add <file>,将文件添加到暂存区 git ...
- vegan 包进行Adonis 分析
Adonis 分析 是基于距离矩阵的多变量方差置换分析, 代码示例: 默认使用bray 距离来计算样本间的距离矩阵 参考资料: https://www.rdocumentation.org/packa ...
- ZooKeeper简述
一.简介 ZooKeeper是一个高性能,分布式的,开源分布式应用协调服务.它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如同步,集群管理,命名空间,配置维护等.ZooKeeper使 ...
- 在PHP中使用curl_init函数的说明
$ch = curl_init(); $c_url = 'http://www.baidu.com'; $c_url_data = "product_&type=".$ty ...
- Pytest 生成Report
1. 生成JunitXML 格式的测试报告 JunitXML报告是一种很常用的测试报告,比如可以和Jenkins进行集成,在Jenkins的GUI上显示Pytest的运行结果,非常便利.运行完case ...
- 【RespberryPi】数码管
http://blog.mangolovecarrot.net/2015/06/03/raspi-study0801/ 应该可以用两块74HC595来驱动显示8位数的数码管.