function program in python¶
Python中的函数式编程。
filter¶
假定你有一个整数列表,你想取出其中的偶数项。
可以使用for循环 来完成:
integers = range(0, 10) even = [] for i in integers: if i % 2 == 0: even.append(i) >>> even >>> [0, 2, 4, 6, 8]
使用filter函数加高阶函数可以更简洁的完成:
even = filter(lambda x: x % 2 == 0, integers)
上面只用一行代码就可以了,而for循环的方法需要4行代码。在这里使用了 匿名函数lambda [5]。如果用普通函数将lambda函数展开,则:
def is_event(x): return x % 2 == 0 even = filter(is_event, integers)
也可以用列表解析(list comprehension)的方法:
even = [x for x in integers if x % 2 == 0]
列表解析的方法更加简洁,没有任何函数调用。
比较上面三种方案,for循环代码量最大,但便于新手理解;filter和 列表解析都非常简洁,但列表解析的方法更加清晰,语义与自然语言相近 ,速度更快(函数调用都没有)。
map¶
map函数将函数作用于列表中的每个元素,并将结果返回形成一个新列表。如:
map(lambda x: x*x, integers)
>>> [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
同样,可以使用列表解析来达成此任务。
square_list = [x * x for x in integers]
reduce¶
Python 3中将reduce函数移到了reduce()。
- class functools¶
- reduce(function, iterable[, initializer])¶
return a single value.
Parameters: - function (callable) – 需要两个输入参数的函数
- iterable (iterable) – 一个可迭代对象
- initializer – 指示iterable的起始位置
Returns: a single value
reduce函数等同于
def reduce(function, iterable, initializer=None):
it = iter(iterable)
if initializer is None:
value = next(it)
else:
value = initializer
for element in it:
value = function(value, element)
return value
如: reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])等同于((((1+2)+3)+4)+5)
本文部分参考Beyond the For-Loop: Higher Order Functions and List Comprehensions in Python