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


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. 七:HDFS Permissions Guide 权限

    1.权限模式     简单:启动HDFS的操作系统用户即为超级用户,可以通过HADOOP_USER_NAME指定     kerberos: 2.group mapping      组列表由grou ...

  2. JQuery中each方法实现

    each()函数是基本上所有的框架都提供了的一个工具类函数,通过它,你可以遍历对象.数组的属性值并进行处理. jQuery和jQuery对象都实现了该方法,对于jQuery对象,只是把each方法简单 ...

  3. mysql 相同表结构拷贝数据

    第一种方法: 在导出表结构的时候可以勾选导出数据: 第二种方法: 表已经存在了,只需要数据即可.这个时候可以编写sql语句(暂不支持不同服务器之间的表数据复制) insert into tab_a(i ...

  4. C++ 学习笔记之 STL 队列

    一.  引言 在算法以及数据结构的实现中,很多地方我们都需要队列(遵循FIFO,先进先出原则). 为了使用队列,我们可以自己用数组来实现队列,但自己写太麻烦不说,并且还很容易出错. 好在C++的STL ...

  5. 3dContactPointAnnotationTool开发日志(四)

      没办法,为了能在寝室接着做这玩意只好又在电脑上装一个和实验室版本一样的unity了.虽然打开后UI界面还是一团糟,不过至少要的东西都在,又手动调了调UI界面.   然后把旋转视角功能加上了.鼠标右 ...

  6. lol人物模型提取(九)——终章

      之前顺丰来人拍照取证了一下,又和卖家协商了一下,最后顺风只打算赔偿我23块钱的顺丰邮寄卡,就是当你寄货物的时候可以用这卡来抵邮钱.想想也没多少钱,对方也不同意微信或支付宝转账给我,索性不让顺丰公司 ...

  7. 菜鸟的飞翔日记-os篇

    一轮王道os复习感想 1概述 虽然去年有上操作系统这门必修课,考的成绩也算理想,本来还有点沾沾自喜,嗯,觉得自己学的还不错,知道有一天我拿起了王道,(没给王道打广告)看王道的原因完全在于为考研做准备, ...

  8. vue服务端渲染简单入门实例

    想到要学习vue-ssr的同学,自不必多说,一定是熟悉了vue,并且多多少少做过几个项目.然后学习vue服务端渲染无非解决首屏渲染的白屏问题以及SEO友好. 话不多说,笔者也是研究多日才搞明白这个服务 ...

  9. f-measure[转]

    F-Measure又称为F-Score,是IP(信息检索)领域常用的一个评价标准,计算公式为: 其中β是参数,P是准确率(Precision),R是召回率(Recall). F1-Measure:当参 ...

  10. 【bzoj3631】[JLOI2014]松鼠的新家 LCA+差分数组

    题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀请小熊维尼前来 ...