q, [y for y in range(10)])
#多定义了一个函数,尤其在只是用一次的情况下
所以你会发现自己如果能将「遍历列表,给遇到的每个元素都做某种运算」的过程从一个循环里抽象出来成为一个高阶函数 map,然后用 lambda 表达式将这种运算作为参数传给 map 的话,思维水平就要高出一般的原写法。
(2)reduce函数
reduce()函数也是Python内置的一个高阶函数。
reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
def f(x, y):
return x + y
reduce(f, [1, 3, 5, 7, 9])
#先计算头两个元素:f(1, 3),结果为4;
#再把结果和第3个元素计算:f(4, 5),结果为9;
#再把结果和第4个元素计算:f(9, 7),结果为16;
#再把结果和第5个元素计算:f(16, 9),结果为25;
#由于没有更多的元素了,计算结束,返回结果25
(3) filter函数
filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
#list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数
def is_odd(x):
return x % 2 == 1
filter(is_odd, [1, 4, 6, 7, 9, 12, 17])
#输出
[1, 7, 9, 17]
当然还可以实现很多功能,取决与函数定义的功能(删除 None 或者空字符串 等),filter仅仅是辅助函数起到过滤作用。
(4)函数式编程
def func(x):
def funcx(y):
return x+y
return funcx
func2 = func(2)
func5 = func(5)
print(func2(5)) # 输出 7
print(func5(5)) # 输出 10
inc()函数返回了另一个函数incx(),于是我们可以用inc()函数来构造各种版本的inc函数,比如:inc2()和inc5()。这个技术其实就是上面所说的Currying技术。从这个技术上,你可能体会到函数式编程的理念:把函数当成变量来用,关注于描述问题而不是怎么实现,这样可以让代码更易读。