转自  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)。

并且总结了函数式编程具有五个鲜明的特点。:

  1. 函数是"第一等公民"
  2. 只用"表达式",不用"语句"
  3. 没有"副作用"
  4. 不修改状态
  5. 引用透明

意义如下:

  1. 代码简洁,开发快速

函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。

  1. 接近自然语言,易于理解
  2. 更方便的代码管理
  3. 易于"并发编程" 函数式编程不需要考虑"死锁"(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

其工作方式如下图:

参考资料:

函数式编程初探(阮一峰)

函数式编程扫盲篇3

Python学习(26):Python函数式编程的更多相关文章

  1. python学习笔记011——函数式编程

    1 函数式编程 面向对象 ,面向过程 ,函数式编程 侧重函数的作用,注重函数结果的传递 函数可以被赋值,也可以接受其他的值 2 函数式编程特点 1.函数是一等公民 与其他变量一样,可以赋值和被赋值,可 ...

  2. Python学习笔记之函数式编程

    python中的高阶函数 高阶函数就是 变量名指向函数,下面代码中的变量abs其实是一个函数,返回数字的绝对值,如abs(-10) 返回 10 def add(x,y,f): return f(x) ...

  3. python学习笔记(六) 函数式编程

    一 函数对象 函数同样可以作为对象复制给一个变量,如下: f = abs; print(f(-10)) f = 'abs'; print(f) def add(a,b,f): return f(a) ...

  4. python学习22之函数式编程

    '''''''''1.高阶函数:将函数作为参数传递到另一个函数中,作为这个函数的参数,这样的方式叫高阶函数(1)map:两个参数,一个是函数,一个是iterator,将函数依次作用于Iterator中 ...

  5. python学习笔记1 -- 函数式编程之高阶函数 sorted排序

    python提供了很强大的内置排序函数,妈妈再也不担心我不会写冒泡排序了呀,sorted函数就是这个排序函数,该函数参数准确的说有四个,sorted(参数1,参数2,参数3,参数4). 参数1 是需要 ...

  6. python学习笔记1 -- 函数式编程之高阶函数 map 和reduce

    我用我自己,就是高阶函数,直接表现就是函数可以作为另一个函数的参数,也可以作为返回值 首先一个知识点是 函数的表现形式,印象中的是def  fw(参数)这种方式定义一个函数 python有很多的内置函 ...

  7. Python学习笔记6 函数式编程_20170619

    廖雪峰python3学习笔记: # 高阶函数 将函数作为参数传入,这样的函数就是高阶函数(有点像C++的函数指针) def add(x, y): return x+y def mins(x, y): ...

  8. python学习笔记1 -- 函数式编程之高阶函数 使用函数作为返回值

    使用函数作为返回值,看起来就很高端有木有,前面了解过函数名本身就是一个变量,就比如abs()函数,abs只是变量名,而abs()才是函数调用,那么我们如果把ads这个变量作为返回值返回会怎么样呢,这就 ...

  9. python学习笔记1 -- 函数式编程之高阶函数 filter

    filter 函数用于过滤序列,与map 和reduce函数类似,作为高阶函数,他们也是同样的使用方法,filter(参数1, 参数2),参数1是一个函数,而参数2是一个序列. filter的作用是根 ...

  10. Python学习-26.Python中的三角函数

    Python中的三角函数位于math模块内. 引入模块: import math 输出pi import math print(math.pi) 得:3.141592653589793 math模块内 ...

随机推荐

  1. 转:用法总结:NSNumber、NSString、NSDate、NSCalendarDate、NSData(待续)

    NSNumber + (NSNumber *)numberWithInt:(int)value; + (NSNumber *)numberWithDouble:(double)value; - (in ...

  2. pyqt5加载网路图片,不本地下载。

    依赖组件: requests class webImg: pass if __name__ == '__main__': import sys from PyQt5.QtWidgets import ...

  3. linux下怎么用tree命令以树形结构显示文件目录结构?

    tree命令以树状图列出文件目录结构.不过某些Linux上(Centos 6.4)没有tree命令,本文将介绍安装方法. 常用参数: ? 1 2 3 4 5 6 tree -d 只显示目录.   tr ...

  4. oracle 杀掉当前用户的进程

    select ' alter system kill session '''|| sid ||','||serial# || ''';' from v$SESSION where username=' ...

  5. C# 文件过滤器filter

    OpenFileDialog对话框的Filter属性说明: 首先说明一个示例,分析一下Filter属性的构成:“ Excel文件|*.xls ”,前面的“Excel文件”成为标签,是一个可读的字符串, ...

  6. MySQL的varchar长度问题

    From: http://blog.csdn.net/longyulu/article/details/7863737 http://dinglin.iteye.com/blog/914276 htt ...

  7. u3d加载加密和未加密

    using UnityEngine; using System.Collections; public class loadnew : MonoBehaviour { public bool IsCo ...

  8. Android应用坐标系统全面具体解释

    1 背景 去年有非常多人私信告诉我让说说自己定义控件,事实上通观网络上的非常多博客都在讲各种自己定义控件,可是大多数都是授之以鱼.却非常少有较为系统性授之于渔的文章,同一时候由于自己也迟迟没有时间规划 ...

  9. Linux 找不到php.ini

    在部署环境中利用phpinfo()查看,显示php.ini 路径为/usr/local/php5/lib 但是到对应路径中,找不到php.ini文件,在网上找到相关方法,留下备注. Configura ...

  10. Mac OS终端中设置颜色高亮和自动补全

    已测试通过,原文:http://blog.csdn.net/songjinshi/article/details/8945809 一.颜色高亮显示 针对terminal采用bash模式: 编辑 ~/. ...