map()
map()函数的常见调用形式如下所示:1
map(func, iterable)
map()需要两个必填参数,第一个参数是一个函数名,第二个参数是一个可迭代的对象,如列表、元组等。
map()实现的功能很简单,就是将第二个参数(iterable)中的每一个元素分别传给第一个参数(func),依次执行函数得到结果,并将结果组成一个新的list对象后进行返回。返回结果永远都是一个list。
简单示例如下:1
2
3lambda s : s * 2 double_func =
1,2,3,4,5]) map(double_func, [
[2, 4, 6, 8, 10]
除了传入一个可迭代对象这种常见的模式外,map()还支持传入多个可迭代对象。1
map(func, iterable1, iterable2)
在传入多个可迭代对象的情况下,map()会依次从所有可迭代对象中依次取一个元素,组成一个元组列表,然后将元组依次传给func;若可迭代对象的长度不一致,则会以None进行补上。
通过以下示例应该就比较容易理解。1
2
3
4
5
6
7lambda x,y : (x or 0) + (y or 0) plus =
1,2,3], [4,5,6]) map(plus, [
[5, 7, 9]
1,2,3,4], [4,5,6]) map(plus, [
[5, 7, 9, 4]
1,2,3], [4,5,6,7]) map(plus, [
[5, 7, 9, 7]
在上面的例子中,之所以采用x or 0的形式,是为了防止None + int出现异常。
需要注意的是,可迭代对象的个数应该与func的参数个数一致,否则就会出现异常,因为传参个数与函数参数个数不一致了,这个应该比较好理解。1
2
3
4
5lambda x,y : x + y plus =
1,2,3]) map(plus, [
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: <lambda>() takes exactly 2 arguments (1 given)
另外,map()还存在一种特殊情况,就是func为None。这个时候,map()仍然是从所有可迭代对象中依次取一个元素,组成一个元组列表,然后将这个元组列表作为结果进行返回。1
2
3
4
5
6
7
8None, [1,2,3,4]) map(
[1, 2, 3, 4]
None, [1,2,3,4], [5,6,7,8]) map(
[(1, 5), (2, 6), (3, 7), (4, 8)]
None, [1,2,3,4], [5,6,7]) map(
[(1, 5), (2, 6), (3, 7), (4, None)]
None, [1,2,3,4], [6,7,8,9], [11,12]) map(
[(1, 6, 11), (2, 7, 12), (3, 8, None), (4, 9, None)]
reduce()
reduce()函数的调用形式如下所示:1
reduce(func, iterable[, initializer])
reduce()函数的功能是对可迭代对象(iterable)中的元素从左到右进行累计运算,最终得到一个数值。第三个参数initializer是初始数值,可以空置,空置为None时就从可迭代对象(iterable)的第二个元素开始,并将第一个元素作为之前的结果。
看下reduce()的例子:1
2
3
4
5
6
7
8
9
10
11def reduce(function, iterable, initializer=None):
it = iter(iterable)
if initializer is None:
try:
initializer = next(it)
except StopIteration:
raise TypeError('reduce() of empty sequence with no initial value')
accum_value = initializer
for x in it:
accum_value = function(accum_value, x)
return accum_value
再加上如下示例,对reduce()的功能应该就能掌握了。1
2
3
4
5lambda x, y : x + y plus =
1,2,3,4,5]) reduce(plus, [
15
1,2,3,4,5], 10) reduce(plus, [
25
配合map(),我们就可以写出把str转换为int的函数:1
2
3
4
5
6
7
8def fn(x, y):
return x * 10 + y
...
def char2num(s):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
...
'13579')) reduce(fn, map(char2num,
13579
整理成一个str2int的函数就是:1
2
3
4
5
6def str2int(s):
def fn(x, y):
return x * 10 + y
def char2num(s):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
return reduce(fn, map(char2num, s))
还可以用lambda函数进一步简化成:1
2
3
4
5def char2num(s):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
def str2int(s):
return reduce(lambda x,y: x*10+y, map(char2num, s))
也就是说,假设Python没有提供int()函数,你完全可以自己写一个把字符串转化为整数的函数,而且只需要几行代码!