Tuesday, May 15, 2007

map(), filter(), reduce()

for 语句一样,内置函数 map(), filter(), 和 reduce() 都是对一个序列的每一个元素执行一定的操作。这三个函数的第一个参数都是一个函数,而后续 参数都是一些序列。http://wiki.woodpecker.org.cn/moin/TPiP/AppendixA

1.map() 函数返回一个与输入序列长度相同的列表,其中每一个元素都是对 输入序列中相应位置的元素的转换的结果。

如果传给 map() 的函数参数接受多个参数,那么就可以给 map 传递多个序列。如果这些传进来的序列长度不一, 那就在短的序列后面补 None。函数参数还可以是 None , 这样的话就会用序列参数中的元素生成一个元组的序列。

2.filter() 函数返回的是输入序列中满足一定条件的元素组成的序列, 这个条件由传递给 filter() 的函数参数决定。该函数参数必须接受 一个参数,它的返回值会被当作布尔值处理。

3.reduce() 函数的第一个参数是个函数,该函数必须接受两个参数。 它的第二个参数是一个序列,reduce() 函数还可以接受可选的第三个参数作为初始值。 对于输入序列中每一个元素,reduce() 将前面的累计结果与该元素结合起来, 直到序列的末尾。reduce() 的效果——就像 map()filter() 一样—— 和循环类似,也是对序列中每一个元素执行操作,它的主要目的是产生某种累计结果, 累加,或是在许多不确定的元素中进行选择。

4.List comprehension (listcomps) 是一种由 python2.0 引入的语法形式。根据输入序列产生一个列表。list comprehension 是由以下部分组成:(1) 两端的方括号 (就像构造列表的语法一样,其实它就是在构造一个列表)。(2) 一个表达式,它 通常包含一些在 for 子句被绑定的名字。(3) 一个或多个 for 子句, 它们循环地对名字进行绑定 (就像 for 循环那样)。(4) 零或多个 if 子句,用来 对结果进行限制。通常 if 子句也包含一些在 for 子句中被绑定的名字。其中for 子句中绑定的名字在它外部的(或是全局的,如果名字是这么定义的话)作用范围内仍然有效。eg:

1 >>> [(n,c) for n in (95,100,105) for c in 'aei' if ord(c)>n]
2 [(95, 'a'), (95, 'e'), (95, 'i'), (100, 'e'), (100, 'i')]

No comments: