这篇写了忘发。现在补上。


Python不是也不大可能成为一种函数式的编程语言,但是它支持许多有价值的函数式编程语言构建。
也有些表现的像函数式编程机制但是从传统上也不能认为是函数式编程语言的构建。Python提供的以四中内建函数和lambda表达式的形式出现。

匿名函数与lambda

lambda [arg1, [arg2, ... argN]]:expression

Python允许用lambda关键字创造匿名函数。匿名是因为不需要以标准的方式来声明。然而,作为函数,它们也能有参数。一个完整的lambda“语句”代表了一个表达式,这个表达式的定义体必须和声明放在同一行。参数是可选的,如果用参数的话,参数通常也是表达式的一部分。
下例将展示单行语句和lambda语句的相似之处:

>>> def true():    return True

>>> true()
True
>>> lambda :True
<function <lambda> at 0x02BDA430>
>>> fun = lambda :True
>>> fun()
True

下面是表达式的一些使用区别

def add(x, y): return x + y
lambda x, y :x + y
def usuallyAdd2(x, y=2): return x + y #有默认参数
lambda x, y=2: x + y
def showAllAsTuple (*z): return z
lambda *z: z

lambda表达式运作起来就如一个函数,当被调用时,创造一个框架对象。将它赋值给一个对象后,该对象就是相应的函数。

内建函数
filter()
这个函数在给定一个对象序列和一个过滤函数后,每个序列元素通过这个过滤器进行筛选,保留返回为真的对象。
如果我们想自己编写filter(),它大概是这样的:

def filter(bool_func, seq):
  filtered_seq = []
  for eachItem in seq:
    if bool_func(eachItem):
      filtered_seq.append(eachItem)
  return filtered_seq

map()
map()内建函数和filter()相似,因为它也能通过函数来处理序列。然而,不像filter(),map()将函数调用“映射”到每个序列的元素上,并返回一个含有所有返回值的列表。
如果我们想自己编写map(),它大概是这样的:

def map(func, seq):
  mapped_seq = []
  for eachItem in seq:
    mapped_seq.append(func(eachItem))
  return mapped_seq

reduce()
reduce()使用了一个二元函数,一个序列,和一个可选的初始化器,卓有成效地将那个列表的内容“减少”为一个单一的值,如同它的名字一样。在其他语言中,这种概念称为折叠。
它通过取出序列的头两个元素,将他们传入二元函数来获得一个单一的值来实现,然后又用这个值和序列的下一个元素来获得又一个值,然后直到整个序列都遍历完毕以及最后的值会被计算出来为止。
如果我们想自己编写reduce(),它大概是这样:

def reduce(bin_func, seq, init=None):
  Iseq = list(seq) # convert to list
  if init is None: # initializer?
    res = lseq.pop(0) # no
  else:
    res = init # yes
  for item in lseq: # reduce sequence
    res = bin_func(res, item) # apply function
  return res # return result

偏函数应用
偏函数应用(partial function application, PFA),这种函数将任意数量(顺序)的参数的函数转化成另一个带剩余参数的函数对象。
这个概念和currying的概念有相关,currying也就是科里化,是指把原本接受多个参数的函数变换为接受一个单一参数的函数,并且返回接受余下参数且返回结果的新函数的技术。
这讲起来有些抽象,可以认为这个不提供参数就会使用默认参数的情形相似。在PFA的例子中,参数不需要调用函数的默认值,只需明确调用集合。
如下例子:

>>> from operator import add,mul
>>> from functools import partial
>>> add1 = partial(add,1)
>>> add1(10)
11
>>> mul100 = partial(mul, 100)
>>> mul100(5)
500

上述的这种偏函数调用很无聊,并没有显现出偏函数的威力,但是这能让我们知道如何使用它。当调用带许多参数的函数的时候,PFA是最好的方法。

2015/9/18 Python基础(14):函数式编程的更多相关文章

  1. Python基础:函数式编程

    一.概述 Python是一门多范式的编程语言,它同时支持过程式.面向对象和函数式的编程范式.因此,在Python中提供了很多符合 函数式编程 风格的特性和工具. 以下是对 Python中的函数式编程 ...

  2. python基础之函数式编程、匿名函数、内置函数

    一 函数式编程 不修改外部状态. 模仿数学里得函数进行编程. 用函数编程写出得代码相当精简. 可读性比较差. 例子: y=2*x+1 x=1 def test(x): return 2*x+1 tes ...

  3. python基础之函数式编程

    一.定义: 函数作为参数作用:将核心逻辑传入方法体,使该方法的适用性更广,体现了面向对象的开闭原则: 函数作为返回值作用:逻辑连续,当内部函数被调用时,不脱离当前的逻辑. 二.高阶函数: 1.定义:将 ...

  4. 可爱的 Python : Python中的函数式编程,第三部分

    英文原文:Charming Python: Functional programming in Python, Part 3,翻译:开源中国 摘要:  作者David Mertz在其文章<可爱的 ...

  5. Python进阶:函数式编程实例(附代码)

    Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...

  6. 十四. Python基础(14)--递归

    十四. Python基础(14)--递归 1 ● 递归(recursion) 概念: recursive functions-functions that call themselves either ...

  7. Python进阶之函数式编程(把函数作为参数)

    什么是函数式编程? 什么是函数式编程? 函数:function 函数式:functional,一种编程范式 函数式编程是一种抽象计算的编程模式 函数≠函数式,比如:计算≠计算机 在计算机当中,计算机硬 ...

  8. Python Decorator 和函数式编程

    看到一篇翻译不错的文章,原文链接: Python Decorator 和函数式编程

  9. Python 基础之socket编程(二)

    Python 基础之socket编程(二) 昨天只是对socket编程做了简单的介绍,只是把socket通信的框架搭建起来,要对其中的功能进行进一步的扩充,就来看看今天的料哈! 一.基于tcp的套接字 ...

随机推荐

  1. Prime Matrix(暴力出奇迹)

    Description You've got an n × m matrix. The matrix consists of integers. In one move, you can apply ...

  2. Thunder团队——事后诸葛亮会议

    小组名称:Thunder 项目名称:爱阅APP 小组成员:王航 李传康 代秋彤 邹双黛 苗威 宋雨 胡佑蓉 杨梓瑞 一.设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型 ...

  3. 20145214实验二 Java面向对象程序设计

    20145214实验二 Java面向对象程序设计 初步掌握单元测试和TDD 三种代码 伪代码 `百分制转五分制:` `如果成绩小于60,转成"不及格"` `如果成绩在60与70之间 ...

  4. c++ 第五次作业(计算器第三步)

    第五次作业 (计算器第三步) 项目源文件地址:calculator 本次作业改进情况 加入多种读入选择 正常输出答案 -a 选项,输出表达式以及值 -f 选项,从指定文件读入,并把答案输出到指定文件 ...

  5. Alpha冲刺——第三天

    Alpha第三天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...

  6. flash builder 4.6在debug调试时需要系统安装flashplayer debug版本

    http://blog.csdn.net/cupid0051/article/details/46684295

  7. 3dContactPointAnnotationTool开发日志(二二)

      昨天是实现了显示GameObject子GameObject的选项卡功能,今天就是要让statusPanel可以控制它们的位置.旋转和缩放了.   没什么难的,对应选项卡绑定上对应的物体或子物体即可 ...

  8. oracle 9i 图文安装教程 oracle 9i 安装

    我的安装文件是ISO镜像文件,使用Virtual DAEMON Manager v 4.10打开: ora9i-1.iso ora9i-2.iso ora9i-3.iso 首先必须把上面三个镜像文件都 ...

  9. Python爬虫requests判断请求超时并重新发送请求

     下面是简单的一个重复请求过程,更高级更简单的请移步本博客: https://www.cnblogs.com/fanjp666888/p/9796943.html  在爬虫的执行当中,总会遇到请求连接 ...

  10. Qt入门实例

    一.基于Qt设计师 1.创建一个GUI项目,选择“Qt4 Gui Application”.其中还有Empty Qt4 Project(空的工程),Qt4 Console Applicaiton(基于 ...