引入:
越低级的语言,越贴近计算机,执行效率高;越高级的语言,越贴近计算,执行效率低。
函数式编程的特点:允许函数本身作为参数传入另一个函数,还允许返回一个函数。
高阶函数
将函数作为参数传入,此函数称为 高阶函数。
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。