在适用于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
的。这是错误还是我错过了什么?
答案 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]]
但是当最短的可迭代停止时,zip
和izip
仍将停止:
>>> 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
。