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


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. VUE中关于表单提交的简单实现

    main.js import Vue from "../vue.js"; import App from "./App.js"; //启动 new Vue({ ...

  2. oracle数据库之PL/SQL 流程控制语句

    介绍 PL/SQL 的流程控制语句, 包括如下三类: 1.控制语句: IF 语句 2.循环语句: LOOP 语句, EXIT 语句 3.顺序语句: GOTO 语句, NULL 语句 一 条件语句 IF ...

  3. <Effective C++>读书摘要--Resource Management<二>

    <Item 15> Provide access to raw resources in resource-managing classes 1.You need a way to con ...

  4. Winform 子窗体设置刷新父窗体

    方法1:所有权法 父窗体:Form1    子窗体:Form2 //Form1:窗体代码 //需要有一个公共的刷新方法 public void Refresh_Method() { //... } / ...

  5. 关于FEer发展方向的思考

    今天学习了HTTP权威指南这本书,虽然标题是对FEer发展的思考,不过我打算稍后再说这个议题,先对今天学习的内容做个总结. 首先:原来访问服务器的方式有多重,核心是URI,也就是统一资源定位,按照访问 ...

  6. 网众远程修改ip、dns

    修改文件 修改ip vi /etc/rc.d/rc.inetd1.config IPADDR[0] 对应第一块网卡的ip 修改dns vi /etc/resolv.conf nameserver 21 ...

  7. cacti安装spine 解决WARNING: Result from CMD not valid. Partial Result: U错误

    安装spine用来替换cacti原本的执行方式,需要的包在附件中,请注意spine的安装包和你安装的cacti版本不用相同,最好是最新的spine 1.安装gcc #yum install -y gc ...

  8. 第一次通过CLR Profile解决内存占用过高的问题

    炮哥:"嘿,哥们,忙啥呢,电脑卡成这逼样." 勇哥:"在用CLR Profile工具分析下FlexiPrint的内存占用情况." 炮哥:“哎哟,不错啊,玩高级的 ...

  9. java 基础--继承--007

    1,子类只能继承父类所有非私有成员 2,子类不能继承父类的构造方法,但可以通过super去访问父类构造方法 3,子类成员变量和父类成员变量名称不一样,如果一样类似于重写,按子类处理,如果一样,就近原则 ...

  10. 【转载】用C#编写一个简单的记事本

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...