[Python学习笔记-002] lambda, map, filter and reduce

1. lambda

lambda, 即匿名函数,可以理解为跟C语言的宏类似。例如:

>>> max = lambda x, y: x if x > y else y
>>> max(2, 3)
3

而用C语言实现对应的宏就是:

#define max(x, y) ((x) > (y) ? (x) : (y))

注意:

  • lambda的主体必须是单个表达式,而不是一些语句
>>> print2 = lambda x: sys.stderr.write(str(x) + '\n') # <--- YES
>>> print2('Oops')
Oops
5
>>> print2 = lambda x: print(str(x)) # <--- NO (because print() uses lambda actually)
>>> print2('Oops')
Oops
>>>
  • 为了可读性,不要使用嵌套的lambda。例如:
>>> ((lambda x: (lambda y: x + y ** 2))(99))(3) # <--- BAD style
108
>>>

2. map

程序对列表(list)和其他序列常常要做的一件事就是对每一个元素进行一个操作并把结果集合起来。例如:

>>> l1 = [1, 3, 5, 7, 9]
>>> l2 = []
>>> for i in l:
... j = i ** 2
... l2.append(j)
...
>>> l2
[1, 9, 25, 49]
>>>

这时,Python提供的内置函数map()就派上用场了。map()函数会对一个序列对象中的每一个元素应用被传入的函数,并且返回一个包含了所有函数调用结果的一个列表。例如:

>>> l1 = [1, 3, 5, 7, 9]
>>> l2 = list(map(lambda x: x ** 2, l1))
>>> l2
[1, 9, 25, 49, 81]
>>>

map()还支持操作多个序列,例如:

>>> l1 = [1, 2, 3]
>>> l2 = [4, 5, 6]
>>> def xadd(a, b):
... return (a + b) ** 2
...
>>> xadd(1, 4)
25
>>> xadd(2, 5)
49
>>> xadd(3, 6)
81
>>> l3 = list(map(xadd, l1, l2))
>>> l3
[25, 49, 81]
>>>
>>> l1 = [0x1, 0x3, 0x5, 0x7, 0x9]
>>> l2 = [0x2, 0x4, 0x6, 0x8, 0xa]
>>> l3 = [0x5, 0x4, 0x3, 0x2, 0x1]
>>> l4 = list(map(lambda x, y, z: x + z - y, l1, l2, l3))
>>> l4
[4, 3, 2, 1, 0]
>>>

3. filter

函数filter(func, list)对list的每一个元素都执行函数func(), 若结果为真,则保存那个元素。例如:

>>> def is_odd(n):
... if n % 2 == 1:
... return True
... else:
... return False
...
>>> l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l2 = list(filter(is_odd, l1))
>>> l2
[1, 3, 5, 7, 9]
>>>

4. reduce

list = [x1, x2, x3, ...], reduce(func, list)表示把函数func()作用在list上,函数func()必须接收两个参数,reduce把结果继续和list的下一个元素做累积计算,其效果就是:

reduce(func, [x1, x2, x3]) = func(func(x1, x2), x3)

例如:

>>> l = [47, 11, 42, 13]
>>> n = reduce(lambda x, y: x + y, l)
>>> n
113
>>>

上面的例子用图表示为:

[Python学习笔记-002] lambda, map, filter and reduce

注意: 在Python3中,reduce()不再是一个内置函数,而是被放到了模块functools中。

$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
...<snip>...
>>> import functools
>>> l = [47, 11, 42, 13]
>>> n = functools.reduce(lambda x, y: x + y, l)
>>> n
113

参考资料:

上一篇:2021“MINIEYE杯”中国大学生算法设计超级联赛 第九场题解


下一篇:eclipse中的web项目路径和发布好的项目路径