map(function, iterable, …)
Built-in Functions
https://docs.python.org/3/library/functions.html
内置函数
https://docs.python.org/zh-cn/3/library/functions.html
Return an iterator that applies function to every item of iterable, yielding the results. If additional iterable arguments are passed, function must take that many arguments and is applied to the items from all iterables in parallel. With multiple iterables, the iterator stops when the shortest iterable is exhausted. For cases where the function inputs are already arranged into argument tuples, see itertools.starmap().
返回一个将 function 应用于 iterable 中每一项并输出其结果的迭代器。如果传入了额外的 iterable 参数,function 必须接受相同个数的实参并被应用于从所有可迭代对象中并行获取的项。当有多个可迭代对象时,最短的可迭代对象耗尽则整个迭代就将结束。对于函数的输入已经是参数元组的情况,请参阅 itertools.starmap()。
map(function, iterable, …) 会根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的迭代器。
Python 2.x 返回列表。Python 3.x 返回迭代器 / 迭代对象。
如果函数有多个参数,但每个参数的序列元素数量不一样,会根据最少元素的序列进行。若是传入的多个可迭代对象长度不相同,则按最短的长度进行处理 (这是针对 Python 3 的)。Python 3 中可以处理类表长度不一致的情况,但无法处理类型不一致的情况。
Python 3 中 map() 返回的是一个 object,因为 map() 转变成了迭代器来节约空间,返回的是可迭代对象。如果需要 list 可以直接用 list() 来强制返回一个列表。
Python 中的 map() 函数是一个内置的高阶函数,一般用法是 map(function, iterable, …)。需要传入一个函数,这个函数可以是内置的,也可以是自己定义,也可以是匿名函数。第二个参数是一个可迭代对象,如列表,字符串等等。返回的是一个 map 对象,注意不是列表不能直接输出,可以通过 for 循环或者 list() 来显示。(Python 2 返回的是列表)。
map 函数和 zip 函数都是用来进行并行运算。
1. Python 2.x
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import numpy as np
def square(x):
return x ** 2
map_return = map(square, [1, 2, 3, 4, 5])
print("map_return =", map_return)
print("list(map_return) =", list(map_return))
map_lambda_square = map(lambda x: x ** 2, [1, 2, 3, 4, 5])
print("map_lambda_square =", map_lambda_square)
print("list(map_lambda_square) =", list(map_lambda_square))
map_lambda_add = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
print("map_lambda_add =", map_lambda_add)
print("list(map_lambda_add) =", list(map_lambda_add))
listx = np.array([1, 3, 5, 7, 9, 11, 13], dtype=np.int32)
listy = np.array([2, 4, 6, 8, 10, 12], dtype=np.int32)
listz = np.array([3, 6, 9, 12], dtype=np.int32)
map_lambda_sum = map(lambda x, y, z: x + y + z, listx, listy, listz)
print("map_lambda_sum =", map_lambda_sum)
print("list(map_lambda_sum) =", list(map_lambda_sum))
/usr/bin/python2.7 /home/strong/tensorflow_work/R2CNN_Faster-RCNN_Tensorflow/yongqiang.py
map_return = [1, 4, 9, 16, 25]
list(map_return) = [1, 4, 9, 16, 25]
map_lambda_square = [1, 4, 9, 16, 25]
list(map_lambda_square) = [1, 4, 9, 16, 25]
map_lambda_add = [3, 7, 11, 15, 19]
list(map_lambda_add) = [3, 7, 11, 15, 19]
Traceback (most recent call last):
File "/home/strong/tensorflow_work/R2CNN_Faster-RCNN_Tensorflow/yongqiang.py", line 31, in <module>
map_lambda_sum = map(lambda x, y, z: x + y + z, listx, listy, listz)
File "/home/strong/tensorflow_work/R2CNN_Faster-RCNN_Tensorflow/yongqiang.py", line 31, in <lambda>
map_lambda_sum = map(lambda x, y, z: x + y + z, listx, listy, listz)
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
Process finished with exit code 1
2. Python 3.x
在 Python 3 中,map 函数返回的不是一个列表,而是一个 map 类型的序列。使用时可以根据实际情况的需要,将 map 函数的返回值转化为列表或者元组等。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import numpy as np
def square(x):
return x ** 2
map_return = map(square, [1, 2, 3, 4, 5])
print("map_return =", map_return)
print("list(map_return) =", list(map_return))
map_lambda_square = map(lambda x: x ** 2, [1, 2, 3, 4, 5])
print("map_lambda_square =", map_lambda_square)
print("list(map_lambda_square) =", list(map_lambda_square))
map_lambda_add = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
print("map_lambda_add =", map_lambda_add)
print("list(map_lambda_add) =", list(map_lambda_add))
listx = np.array([1, 3, 5, 7, 9, 11, 13], dtype=np.int32)
listy = np.array([2, 4, 6, 8, 10, 12], dtype=np.int32)
listz = np.array([3, 6, 9, 12], dtype=np.int32)
map_lambda_sum = map(lambda x, y, z: x + y + z, listx, listy, listz)
print("map_lambda_sum =", map_lambda_sum)
print("list(map_lambda_sum) =", list(map_lambda_sum))
/usr/bin/python3.5 /home/strong/tensorflow_work/R2CNN_Faster-RCNN_Tensorflow/yongqiang.py
map_return = <map object at 0x7f7029eb5e10>
list(map_return) = [1, 4, 9, 16, 25]
map_lambda_square = <map object at 0x7f7029ebdc88>
list(map_lambda_square) = [1, 4, 9, 16, 25]
map_lambda_add = <map object at 0x7f7029ec7da0>
list(map_lambda_add) = [3, 7, 11, 15, 19]
map_lambda_sum = <map object at 0x7f7013967dd8>
list(map_lambda_sum) = [6, 13, 20, 27]
Process finished with exit code 0