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