引入:
越低级的语言,越贴近计算机,执行效率高;越高级的语言,越贴近计算,执行效率低。

函数式编程的特点:允许函数本身作为参数传入另一个函数,还允许返回一个函数。

高阶函数

将函数作为参数传入,此函数称为 高阶函数。

def add(x, y, f):        #参数f 为函数
    return f(x) + f(y)

x=-5
y=-6
f = abs
print(add(x,y,f))

11

map()/reduce()

map(): 接收两个参数,一个是函数(可以有任意个参数),另一个是Iterable序列。map()将传入的函数依次作用于序列的每个元素,并将结果作为新的Iterator返回。

def f(x):
    return x * x

>>>r = map(f, [1,2,3,4,5,6,7,8,9])
>>>list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

结果r是一个Iterator,它是 惰性序列,因此通过 list()函数将其转为list,便于观察。

map()作为高阶函数,将运算规则抽象了,可以用来计算复杂的函数,例:

# 将list所有的数字转为字符串
>>>list(map(str, [1,2,3,4,5,6,7,8,9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

reduce():接收两个参数,一个是函数(必须有两个参数),另一个是序列。reduce()将结果继续和序列的下一个元素做累积计算。即
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

例:将序列[1, 3, 5, 7, 9]转为整数 13579

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

例:将字符串转为整型

from functools import reduce

def str2int(s):
    def fn(x,y):
        return x * 10 + y
    def char2num(s):
        return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9':9}[s]
    return reduce(fn, map(char2num, '123456'))

filter

和map()类似,filter() 也接收一个函数和一个Iterable序列,不同点是filter()将传入的函数依次作用每个元素,然后按返回值是True还是False决定保留还是丢弃此元素。
例,在一个list中,删掉偶数,保留奇数:

def is_odd(n):
    return n % 2 == 1
list(filter(is_odd, [1,2,3,4,5,6,7]))
[1,3,5,7]

filter()返回的也是Iterator,即一个惰性序列,要强迫完成计算,需要用list()函数获得所有结果并返回list。