Почему в документах упоминается, что padnone эмулирует поведение встроенной карты? - PullRequest
2 голосов
/ 03 мая 2019

В Itertools Recipes для Python 3.7 и более ранних версий упоминается, что 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 Ответ

4 голосов
/ 03 мая 2019

Я думаю, что эта строка устарела - она ​​не была обновлена ​​для поведения Python 3 map или для существования 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)]

Если вы хотите эмулировать поведение None-padding map в вашей собственной функции, которая принимает несколько итераций,Вы могли бы расширить более короткие итерации с помощью padnone перед использованием zip или izip.

Это стало менее полезным с введением itertools.izip_longest в Python 2.6, который обеспечивает более удобный и безопасный способколодки в этом случае использования.С padnone вы должны заранее знать, какие итерации были короче и нуждались в заполнении;с izip_longest, в этом больше нет необходимости.

В Python 3 map больше не * None -пэды по умолчанию, так что отступы больше не эмулируют map.

...