为什么文档中提到padnone模仿内置地图的行为?

时间:2019-05-02 22:32:24

标签: python itertools

在适用于Python 3.7和更低版本的Itertools Recipes中,提到了padnone “模拟内置map()函数的行为”

def padnone(iterable):
    """Returns the sequence elements and then returns None indefinitely.

    Useful for emulating the behavior of the built-in map() function.
    """
    return chain(iterable, repeat(None))

虽然我了解padnone的有用性,但我看不出它是如何模拟 map的。这是错误还是我错过了什么?

1 个答案:

答案 0 :(得分:4)

我认为该行已过时-尚未针对map的Python 3行为或itertools.zip_longest的存在进行过更新。

map可以采用一个多参数函数和多个参数可迭代项:

>>> from operator import add
>>> list(map(add, [1, 2], [10, 20]))
[11, 22]

在Python 2中,如果可迭代项的长度不尽相同,则较短的可迭代项将用None填充:

>>> map(lambda x, y: [x, y], [1, 2], [10]) # Python 2
[[1, 10], [2, None]]

但是当最短的可迭代停止时,zipizip仍将停止:

>>> zip([1, 2], [10]) # still Python 2
[(1, 10)]
>>> list(itertools.izip([1, 2], [10])) # still Python 2
[(1, 10)]

如果您想在需要多个可迭代项的函数中模拟map的无填充行为,则可以在使用padnone或{{之前,使用zip扩展较短的可迭代项。 1}}。

随着Python 2.6中izip的引入,此功能不再那么有用,它提供了一种更方便,更安全的方法来填充此用例。使用itertools.izip_longest,您必须以某种方式预先知道哪些可迭代项较短并且需要填充。使用padnone,则不再需要。

在Python 3中,默认情况下izip_longest不再是map-填充,因此填充不再真正地模仿None