Python--函数式编程

作者:武汉味美食家餐饮管理有限公司 来源:www.cj17917.com 发布时间:2017-09-06 11:02:35
Python--函数式编程

函数式编程就是一种抽象程度很高的编程范式。这个概念有些抽象,简单理解的话,只需要记住一点:函数式编程的一大特点是允许把函数本身作为参数传入另一个函数,还允许返回一个函数!

Python并不是一种函数式编程语言,但是却为函数式编程提供了部分支持。下面,我将举一些在Python中常用的函数式编程的例子。

高阶函数

所谓高阶函数,是可以接收另一个函数作为参数的函数。这个听起来有点新奇,因为一般情况下函数的参数都是数据变量。但是,其实我在之前说道字典按值排序的时候,我们给 sorted() 函数的参数 key 赋值的时候,所赋的就是一个函数。这种将函数作为参数带入函数的用法有时会为我们提供极大的方便。

1. lambda 表达式

先来看看如何构建匿名函数。一般对函数的定义都是通过 def 关键字加函数名的形式进行。可也有一类特殊的匿名函数,没有名字,无目的地服务,但是却能返回一个可调用的函数对象,在一些特殊的应用中(比如字典的按值排序)非常方便。具体用法如下:

设计一个两数相加的加法匿名函数

lambda x, y: x + y

紧跟lambda关键字之后的是函数的参数,参数之后一个 “:” 号,后面是一个表达式,代表函数的返回值。lambda表达式只有一行,且代表了一个函数对象。

像上面这样,仅仅一个lambda表达式是没什么用的,这就好比是一个对象,却没有任何引用指向它,想要应用这个函数,需要一个引用,例如

addXY = lambda x, y: x + y print(addXY(1, 2)) # >>> 3

这个例子就再清楚不过了,lambda表达式创建了一个函数对象,引用addXY指向这个对象。

当然,lambda表达式所创建的函数对象也可以没有参数:

true = lambda :True

函数 true 没有参数,作用是返回 True

2. 高阶函数的应用

lambda表达式为我们展示了返回对象为函数的情况,那么,也就可以再深一步,看看函数对象能不能被当做参数传入函数。

看下面这个例子:

double = lambda x: x * 2 def double_add(x, y, double_fun): return double_fun(x) + double_fun(y) print(double_add(1, 2, double)) # >>> 6

先是lambda表达式创建了一个函数对象double,然后,double_add() 函数将函数double当做一个参数使用。我们发现,代码是完全没有问题的。

当然,不止是lambda表达式,任何定义的函数,它的函数名都可以以参数(实参)的形式带入其他函数,比如,下面的这三个函数的参数中就有别的函数名。

filter(), map(), 和 reduce()

初步了解了什么是高阶函数,我们就来看看Python中常用的三种高阶函数。

1. filter()

顾名思义,过滤器。语法是这样的:filter(func, seq) 也就是说,将一个序列和返回True or False的函数作为参数,通过函数来筛选序列,保留序列中使得函数值为True的的元素。具体用法如下

array = [1, 2, 3, 4, 5, 6] def isEven(num): return num % 2 == 0 for i in filter(isEven, array): print(i) # 依次输出2, 4, 6

可见,这里 filter() 函数以判断偶数的函数 isEven() 的函数名,和列表array作为参数,完成了对列表中元素是偶数的筛选,筛选的过程其实是依次将序列的每一个元素带入函数,函数会返回一个True or False,将返回True的元素作为筛选成功者。最后,filter() 函数生成的是一个可迭代对象。

2. map()

map() 函数与 filter() 类似,以函数和一个序列作为参数,将序列的每一个元素带入函数,函数的计算结果通过一个可迭代的对象返回。

a = [1, 2, 3, 4] for i in map(lambda x: x + 1, a): print(i) # 依次输出2, 3, 4, 5

这里,用lambda表达式替代了显式的函数名,当然是可以允许的。

函数要完成的计算是给序列的每个元素+1,我们发现,通过 map() 函数轻松实现了函数对于没个变量的“映射”。

此外,map() 当中也能存在不止一个序列,对于有多个序列的 map() 函数,则会并行地迭代每个序列:

a = [1, 2, 3] b = [2, 3, 4] for i in map(lambda x, y: x + y, a, b): print(i) # >>> 依次输出3, 5, 7

可见,map()是对这两个序列并行迭代,每次都计算出一个结果。

当然,其实map() 与 filter() 实现的功能我们之前讲的列表解析也可以完成,而且会更简单(详见:Python–列表解析)

3. reduce()

reduce这歌单词的含义是减少、降低的意思。Python当中实现的效果也是这样,他的语法规则如下:

reduce(func, [x1, x2, ..., xn]) = reduce(func, (func(x1, x2), [x3, ..., xn]))

有点类似于一个降维的过程,对一个序列的前两个元素执行函数的运算(当然,reduce里面使用的函数就一定是二元函数了),运算的结果作替代前两个元素加入序列,这样,整个序列就变成了n - 1长的,循环往复,直到只有一个元素时,输出结果

我们尝试用这种方法实现对一个列表的加和

from functools import reduce a = [1, 2, 3] print(reduce(lambda x, y: x + y, a)) # >>> 6

注意用reduce的时候应该先导入相关的模块。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:黄石SEO http://huangshi.4567w.com

  • 上一篇:用GestureDetector实现ViewPager功能
  • 下一篇:最后一页
  • 
    COPYRIGHT © 2015 武汉味美食家餐饮管理有限公司 ALL RIGHTS RESERVED.
    本站所有原创信息,未经许可请勿任意转载或复制使用 网站地图 技术支持:肥猫科技
    精彩专题:网站建设
    购买本站友情链接、项目合作请联系客服QQ:2500-38-100