前言:什么是函数式编程?

先提出这个问题,函数式编程是一种编程范式,这涉及到编程范式。编程范式主要有函数式编程和命令式编程。函数式编程关心数据的映射,命令式编程关心解决问题的步骤。在我看来,函数式编程就是类似于数学中的映射概念,每个输入都有确定的输出。这种被称为没有副作用,事实上真正的函数式编程是没有变量的。函数式编程最大的特点是:将函数作为参数输入,并将函数作为参数输出。最通俗的解释在知乎答案,什么是函数式编程思维。

1)高阶函数

所谓高阶函数就是可以将函数作为参数输入的函数。编写高阶函数就是将其函数式化的过程,让函数能接收别的函数。

注意:

  • 变量可以指向函数名进行操作。f=abs;
  • 函数名也是一个变量,也可以指向变量。abs=f;

示例代码如下:

def add(x, y, f):
    return f(x) + f(y)
add(1,-2,abs)

这里将函数作为参数输入。输出结果为两个数取绝对值的和,3。接下来介绍几个常见的高阶函数。

(1)map

map()函数接收一个函数和一个列表。它的作用是将函数作用到列表中每个元素上面。然后再将结果封装成一个列表输出。示例代码如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def func(x):
    return x*x
list=[1,2,3,4,5]
print map(func,list)

输出结果:

[1, 4, 9, 16, 25]

这里将func函数分别作用到[1,2,3,4,5].然后,输出新的列表。

(2)reduce

reduce同样接收一个函数和一个列表,但是它要求该函数是一个输入两个参数的函数。它的作用的是将每次输出的结果,作为一个参数和列表中的下一个参数共同输入到下一次函数运行中。最后输出一个整数。这个思想类似于递归。示例代码如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def func(x,y):
    return 10*x+y
list=[1,2,3,4,5]
print reduce(func,list)

输出结果:

12345

(3)filter

filter同样接收一个函数和一个列表。它的作用是,将函数作用到每个元素上,如果返回值是true(1),就保留。反之,就丢弃。最后生成一个列表输出。示例代码如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def func(x):'''函数功能:取奇数'''
    if x%2==1:
        return True
    else:
        return False
list=[1,2,3,4,5]
print filter(func,list)

输出结果:

[1, 3, 5]

再举个例子:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def func(s):
        return s and s.strip()
list=['a','b','c','','a']
print filter(func,list)

先将strip方法,这个方法是用来指定列表中边上的元素的。这里为空,则删除空字符。

这里s和s.strip()逻辑与,s.strip()为false时,相与为false,直接返回s(注意是返回s,不是返回false)。当s.strip()为True时,相与为True,返回后一项s.strip()。

(4)sort

排序是老生常谈的话题了,python内置的方法,sort()可以帮助用户来排序。

现在,介绍一下别的玩法。我们可以自定义规则(方法),来满足排序需求。在这之前先说一下,为了描述大小,我们抽象出来,x>y的话,返回1,x<y的话,返回-1,x=y的话返回0。比如,我们可以倒序排列。代码如下:

def func(x,y):
      if x>y:
          return -1
      elif y>x:
          return 1
      else:
          return 0
list=[1,2,3,4,5]
print sorted(list,func)

输出

[5, 4, 3, 2, 1]

这里我们将x>y设置为-1,则排序反过来了。