-1

我已经阅读了 map 函数的文档,并意识到它可以有多个 iterables 的输入。该文件说,当最短的可迭代用尽时,迭代器停止。这是否意味着 map 函数将同时将该函数应用于 2 个迭代中的每个元素,并在完成较短的迭代时停止?我已经尝试并意识到地图会将该函数应用于 2 个可迭代对象中的所有元素,而不会停止。

在此处输入图像描述

4

2 回答 2

1

map内置函数采用表单中的迭代器,*iterables认为这在文档页面上并不明显。你目前只给它一个可迭代的:一个列表[a, c]

它还指出

如果传递了额外的可迭代参数,则函数必须接受那么多参数并并行应用于所有可迭代的项目。

这意味着如果您传递多个可迭代对象,它们将被zipped 并且这些结果用作参数,如下所示:

>>> 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

我认为您将传递列表列表与传递多个列表混淆了。在您的情况下,您只传递了一个包含ac数组的列表,因此该map函数实际上只看到一个整体可迭代,并且它将您的函数调用应用于列表的两个元素(ac)中的每一个。似乎它使每个元素加倍,因为您可以使用普通运算符对 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 回答