【问题标题】:python map function iterationpython map函数迭代
【发布时间】:2013-05-20 23:18:42
【问题描述】:

results 是一个嵌套列表,如下所示:

>>> results
[[1, 2, 3, 'a', 'b'], [1, 2, 3, 'c', 'd'], [4, 5, 6, 'a', 'b'], [4, 5, 6, 'c', 'd']]

pr 是一个函数,定义如下:

>>> def pr(line):
...     print line

结果的正常迭代确实是这样的:

>>> for result in results:
...     pr(result)
... 
[1, 2, 3, 'a', 'b']
[1, 2, 3, 'c', 'd']
[4, 5, 6, 'a', 'b']
[4, 5, 6, 'c', 'd']

但使用 map 的隐式迭代会导致这种行为:

>>> map(pr, results)
[1, 2, 3, 'a', 'b']
[1, 2, 3, 'c', 'd']
[4, 5, 6, 'a', 'b']
[4, 5, 6, 'c', 'd']
[None, None, None, None]

我的问题:为什么 map 函数会产生额外的迭代?

【问题讨论】:

标签: python map


【解决方案1】:

map 将一个函数应用于可迭代对象的每个元素,并将其结果存储回列表(或 Python 3 中的映射对象)中。所以[None, None, None, None]部分就是map函数的返回值。当你执行一个脚本时你不会看到这个,但你也可以在 IDLE 中通过将它分配给一个值来摆脱它:

>>> _ = map(pr, results)

但请注意,结果列表的构造(至少在 Python 2 中)会产生一些影响,因此如果您不需要结果,最好不要在这种情况下使用 map

【讨论】:

    【解决方案2】:

    map 在 Python 2 中返回一个列表,由您传递给它的函数的所有返回值组成。您的 pr 函数返回 None (隐含地,从末尾掉下来)。因此,map 的结果将是一个填充有Nones 的列表,它对应于您传入的可迭代对象中的每个对象。这将由交互式解释器自动打印,因为您没有将其分配给变量 -这是你看到的最后一行。

    当您将它分配给变量时,您可以更清楚地看到这一点:

    >>> a = map(pr, results)
    [1, 2, 3, 'a', 'b']
    [1, 2, 3, 'c', 'd']
    [4, 5, 6, 'a', 'b']
    [4, 5, 6, 'c', 'd']
    >>> a
    [None, None, None, None]
    

    请注意,当您不关心此结果时,使用map 通常会使您的代码更难阅读;并将其用于副作用更是如此。在这两种情况下,最好编写显式循环。

    【讨论】:

      【解决方案3】:

      [None, None, None, None] 是调用map 的结果,它会自动打印在 Python 解释器控制台中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-19
        • 2020-10-18
        • 2021-05-22
        • 1970-01-01
        • 2018-03-16
        • 1970-01-01
        • 1970-01-01
        • 2020-08-06
        相关资源
        最近更新 更多