function program in python

Python中的函数式编程。

函数式编程

高阶函数(hight order function)[1]是一类特殊的函数,它至少满足下面两个条件 中的一个:

  1. 接受一个或多个函数作为输入参数
  2. 返回值为函数

函数式编程(functional programming)[2] [3] [4]是一种编程范式。

filter

假定你有一个整数列表,你想取出其中的偶数项。

  1. 可以使用for循环 来完成:

    integers = range(0, 10)
    
    even = []
    for i in integers:
        if i % 2 == 0:
                even.append(i)
    
    >>> even
    >>> [0, 2, 4, 6, 8]
    
  2. 使用filter函数加高阶函数可以更简洁的完成:

    even = filter(lambda x: x % 2 == 0, integers)
    

    上面只用一行代码就可以了,而for循环的方法需要4行代码。在这里使用了 匿名函数lambda [5]。如果用普通函数将lambda函数展开,则:

    def is_event(x):
        return x % 2 == 0
    
    even = filter(is_event, integers)
    
  3. 也可以用列表解析(list comprehension)的方法:

    even = [x for x in integers if x % 2 == 0]
    

    列表解析的方法更加简洁,没有任何函数调用。

比较上面三种方案,for循环代码量最大,但便于新手理解;filter列表解析都非常简洁,但列表解析的方法更加清晰,语义与自然语言相近 ,速度更快(函数调用都没有)。

map

map函数将函数作用于列表中的每个元素,并将结果返回形成一个新列表。如:

map(lambda x: x*x, integers)
>>> [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

同样,可以使用列表解析来达成此任务。

square_list = [x * x for x in integers]

reduce

Python 3中将reduce函数移到了reduce()

class functools
reduce(function, iterable[, initializer])

return a single value.

Parameters:
  • function (callable) – 需要两个输入参数的函数
  • iterable (iterable) – 一个可迭代对象
  • initializer – 指示iterable的起始位置
Returns:

a single value

reduce函数等同于

def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    if initializer is None:
        value = next(it)
    else:
        value = initializer
    for element in it:
        value = function(value, element)
    return value

如: reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])等同于((((1+2)+3)+4)+5)

本文部分参考Beyond the For-Loop: Higher Order Functions and List Comprehensions in Python