您的位置:首页 > 编程语言 > Python开发

[Python] 内置序列函数之 filter, map, reduce, zip

2013-05-04 19:32 1126 查看
filter, map, reduce, zip都是针对python中的sequence数据类型的内置方法。

  名词解释:本文中的iterable是指可迭代对象,包括sequence和iterator,及其他具有可迭代性的container。

1. filter(function, iterable)

filter的工作原理是使用第一个参数对象(function或者None)来对第二参数对象iterable进行运算,并根据运算结果的布尔值来过滤iterable中的元素。

对function返回值的布尔运算,如果为True,则将当前元素存储到string, tuple或者list中并最终返回对应类型的对象;如果为False,则将当前元素过滤掉,如果function没有返回值,则视为返回None,因此所有元素都会被过滤掉。如果第一个参数不是function而是None,则返回iterable中所有为True的元素。

# function有返回值
>>> filter(lambda d: d != 'a', 'abcd')  # 过滤掉了字母'a'。
'bcd'

>>> def d(x):                     # 不使用lambda时,先定义一个充当过滤器的函数。
     return True if x != 'a' else False

>>> filter(d, 'abcd')
'bcd'


# function没有返回值
>>> def f(x):   
if x != 'a':
print x
else:
pass

>>> foo = filter(f, 'abcd')  # 'abcd'中所有字符都被过滤掉了
b
c
d
>>> foo
''


# 第一个参数为None
>>> filter(None, 'abcd')     # 没有过滤任何东西
'abcd'

>>> filter(None, [1,2,3,4,5,0]) # 过滤掉了0
[1, 2, 3, 4, 5]

注意:只有当iterable是一个string或者tuple的时候,filter返回的才是string或者tuple,其余都全都是返回list。而function是一个单参数的函数。

  2. map(function, iterable, ...)

map会将iterable对象里的元素遍历到function中进行运算,并返回一个list对象来存储所有的运算结果。map支持多个iterable参数,如果多个iterable参数元素数量不同,对于数量较少的那个iterable对象,在超出部分取值时值为None。当第一个参数不为function为None时,返回一个由tuple组成的列表,每个tuple中的元素分别来自各个iterable对象。

>>> map(lambda a: a+1, [1,2,3,4])
[2, 3, 4, 5]
>>> map(lambda a, b: a+b, [1,2,3,4], (2,3,4,5))
[3, 5, 7, 9]
>>> map(lambda a, b: a + b if b else a + 10, [1,2,3,4,5], (2,3,4,5))   # 第2个iterable对象少了一个元素
[3, 5, 7, 9, 15]
>>> map(None, [1,2,3,4,5], [1,2,3])
[(1, 1), (2, 2), (3, 3), (4, None), (5, None)]


注意:function中的参数数量与map中的iterable参数个数相同。

3. reduce(function, iterable, start_value)

reduce函数第一次会在iterable对象中取前两个值传入function中进行运算,然后运算返回值作为第一个参数,再在iterable对象中取第三个值传入function中进行运算,依次类推,直至iterable对象中所有元素被取值完毕。如果设定了start_value值,那么start_value将作为第一次执行function函数时的一个参数,并在iterable中取第一个元素作为function的另一个参数。

>>> reduce(lambda x, y: x+y, range(0,10))
45
>>> reduce(lambda x, y: x+y, range(0,10), 10)
55


  注意:function是一个双参数的函数,如果没有返回值,则返回None到下一次运算中。

>>> reduce(d, range(0,10))
01
None2
None3
None4
None5
None6
None7
None8
None9


4. zip(seq[, seq, ...])

zip函数会对每个sequence对象依次取相同索引的值到一个tuple中,然后返回一个由这些tuple组成的列表。tuple的数量由所有sequence中具有最少索引的那个sequence决定,该sequence取值完毕后便不再继续对剩余的sequence取值。

>>> zip([1,2,3,4],[2,3,4,5])
[(1, 2), (2, 3), (3, 4), (4, 5)]
>>> zip([1,2,3,4], (2,3,4,5,6,7))
[(1, 2), (2, 3), (3, 4), (4, 5)]
>>> zip([1,2,3,4], [[2,3,4],[2,3]])
[(1, [2, 3, 4]), (2, [2, 3])]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: