我已经阅读了 map 函数的文档,并意识到它可以有多个 iterables 的输入。该文件说,当最短的可迭代用尽时,迭代器停止。这是否意味着 map 函数将同时将该函数应用于 2 个迭代中的每个元素,并在完成较短的迭代时停止?我已经尝试并意识到地图会将该函数应用于 2 个可迭代对象中的所有元素,而不会停止。
问问题
77 次
2 回答
1
map
内置函数采用表单中的迭代器,*iterables
认为这在文档页面上并不明显。你目前只给它一个可迭代的:一个列表[a, c]
它还指出
如果传递了额外的可迭代参数,则函数必须接受那么多参数并并行应用于所有可迭代的项目。
这意味着如果您传递多个可迭代对象,它们将被zip
ped 并且这些结果用作参数,如下所示:
>>> def printer(*args):
... print(f'Got {len(args)} arguments:', ','.join(map(str, args)))
...
>>> list(map(printer, [[1, 2, 3], [5, 4, 3, 2, 1]]))
Got 1 arguments: [1, 2, 3]
Got 1 arguments: [5, 4, 3, 2, 1]
>>> list(map(printer, [1, 2, 3], [5, 4, 3, 2, 1]))
Got 2 arguments: 1,5
Got 2 arguments: 2,4
Got 2 arguments: 3,3
我希望这可以消除任何困惑。
于 2020-05-07T08:03:45.060 回答
1
我认为您将传递列表列表与传递多个列表混淆了。在您的情况下,您只传递了一个包含a
和c
数组的列表,因此该map
函数实际上只看到一个整体可迭代,并且它将您的函数调用应用于列表的两个元素(a
和c
)中的每一个。似乎它使每个元素加倍,因为您可以使用普通运算符对 numpy 数组执行逐元素操作。
将多个迭代传递给map
函数就像map(double, a, c)
在这种情况下,是的,当它完成较短的迭代时它会停止。但是,它不会将map
您的函数单独用于每个可迭代对象,而是您需要编写一个单独的函数来一次获取两个参数,因为它一次遍历两个可迭代对象,将相应的元素从两者传递给您的函数,并在较短时停止iterable 没有更多的元素。最后,这将返回一个列表,其中包含映射到相应元素对的函数的结果
一个例子:
a = np.array([1, 2, 3, 4])
c = np.array([6, 7])
def add(x, y):
return x + y
print(list(map(add, a, c)) # [7, 9]
如您所见,这将在较短的迭代耗尽所有元素后停止
于 2020-05-07T08:01:33.993 回答