Python函数式编程

函数是编程是一种抽象程度很高的编程范式。特点之一是允许将函数本身作为参数传入另一个函数。并且允许返回一个函数。

1 高阶函数

变量可以指向的函数

f = abs
其中abs为一个函数,即变量f指向abs本身。

函数名也是变量

abs()是函数,abs其实是一个指向该函数的变量。
ps:abs定义在__builtin__模块中。

传入函数

函数的参数可以接受变量,那么也可以接受其实是变量的函数名。

>>>def add(x, y, f):
          return f(x) + f(y)
>>>add(-9, 6, abs)
15

实际上就是abs(-9) + abs(6)的过程。

总结:把函数作为参数传入,这样的函数就是高阶函数。

2 map() / reduce()

map()

接受两个参数:函数与序列。
map(f, [ something ])
map(str, [1, 2, 3, 4, 5, 6]) ==> ['1', '2', '3', '4', '5', '6']
实际上map()是把计算过程抽象化了。

reduce()

接收两个参数:函数和序列。
与map()不同的是,reduce将接收到的函数作用在序列的每一个元素上并将其累计计算。

>>> def fn(x, y):
       return x * 10 + y
>>> reduce(fn, [1, 3, 5, 7, 9])
13579

3 filter()

filter()接收一个函数和一个序列。
它将传入的函数依次作用于每个元素,然后根据返回值决定保留或是丢弃。
例:找1~100之间的素数

def is_prime(n):
    if n == 1:
        return True
    else:
        for i in range(2, n-1):
            if n % i == 0:
                return False
    return True
print filter(is_prime, range(1, 101))

结果:[1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

4 sorted()

排序算法
通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。

>>> sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]
def reversed_cmp(x, y):
    if x > y:
        return -1
    if x < y:
        return 1
    return 0

传入自定义的比较函数reversed_cmp,就可以实现倒序排序:

>>> sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]

5 返回函数

函数作为返回值
def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

每次返回的函数都是新的。

闭包

返回函数不要应用任何循环变量,或是后续会发生变化的变量。

你可能感兴趣的:(Python函数式编程)