三、函数式编程里的高阶函数
- 高阶函数可以以函数作为参数。
- 常见内置高阶函数:
- map(),它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。这类似于数学中函数的映射关系,map()函数不改变原有的 list,而是返回一个新的 list。list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list。
比如:def f(x): return x*x print map(f, [,5, 6, 7, 8, 9])
- reduce()函数。reduce()函数接收的参数一个函数 f,一个list,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。如:
reduce(f, [list.num1,list.num2])
reduce()还可以接收第3个可选参数,作为计算的初始值。 - filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。如:
def is_odd(x): return x % 2 == 1 filter(is_odd, [1, 4, 6, 7, 9, 12, 17])
返回结果:
4.sorted()函数可对list进行排序,可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该在 y 前面,返回 -1,如果 x 应该在 y 后面,返回 1。 x 和 y 相等,返回 0。因此我们可以实现倒序排序:def reversed_cmp(x, y): if x > y: return -1 if x < y: return 1 return 0 print sorted([36, 5, 12, 9, 21], reversed_cmp)
也可以实现字符穿的排序
- map(),它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。这类似于数学中函数的映射关系,map()函数不改变原有的 list,而是返回一个新的 list。list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list。
- 返回一个函数:
def calc_prod(lst):
def mulx():
mul=1.0
for x in lst:
mul*=x
return mul
return mulx
f = calc_prod([1, 2, 3, 4])
print f()
这里面函数 fcalc_prod内部又定义了一个函数 mulx。由于函数mulx也是一个对象,函数名 mulx就是指向函数 mulx的变量,所以,最外层函数 calc_prod 可以返回变量 mulx,也就是函数 mulx本身。f得到一个返回函数。
- 匿名函数:关键字lambda 表示匿名函数,冒号前面的 x 表示函数参数,只能有一个表达式,不写return。即: lambda x: x * x 。
举个例子:
print filter(lambda s:s and len(s.strip()) > 0,
['test', None, '', 'str', ' ', 'END'])