Руководство по стилю Google Python

Почему Руководство по стилю Google Python предпочитает использование списков и циклов вместо фильтра, карты и сокращения?

Устаревшие особенности языка:  ... "Использовать списки и циклы вместо фильтра, карты и уменьшить".

Объяснение: "Мы не используем версию Python, которая не поддерживает эти функции, поэтому нет причин не использовать новые стили".

Ответ 1

map и filter менее эффективны, чем эквивалент их эквивалента в списке. LC могут выполнять как фильтрацию, так и сопоставление за один шаг, они не требуют явной функции и могут быть скомпилированы более эффективно из-за их специального синтаксиса

# map and filter
map(lambda x:x+1, filter(lambda x:x%3, range(10)))
# same as LC
[x+1 for x in range(10) if x%3]

Просто нет оснований предпочитать карту или фильтр над LC.

reduce немного отличается, потому что нет эквивалентного LC, но он не имеет большого преимущества по сравнению с обычным для цикла.

Ответ 2

Руководство по стилю Google Python не говорит

предпочитает использование списков и для циклов вместо фильтра, карты и уменьшить

Скорее, полное предложение гласит:

Использовать списки и циклы вместо фильтра и карты, когда аргумент функции в любом случае был бы встроенной лямбдой. (мой акцент)

Поэтому не рекомендуется полностью исключать map, например, только

[expression(item) for item in iterable] 

предпочтительнее

map(lambda item: expression(item), iterable)

В этом случае ясно, что понимание списка более прямое и читаемое.

С другой стороны, нет ничего плохого в использовании map:

map(str, range(100))

вместо более длинных

[str(item) for item in range(100)]

Он хорошо работает для загрузки:

In [57]: %timeit map(str,range(100))
100000 loops, best of 3: 12.6 us per loop

In [58]: %timeit [str(item) for item in range(100)]
100000 loops, best of 3: 17 us per loop

Ответ 3

Перечисления списков обычно считаются более "питонными", чем filter, map и reduce.

См. также статью создателя Python Гвидо ван Россума.

Что касается определения этого параметра в "Устаревших языковых функциях" в руководстве по стилю, то, по-видимому, в Python 3 было отклонено filter, map и reduce (см. статья, упомянутая выше).

Некоторые из этих планов в конечном итоге изменились. reduce был исключен из встроенной функции (и перешел в модуль functools), но filter и map по-прежнему доступно как встроенные модули.

Ответ 4

Я думаю, что это потому, что не все знают, как хорошо использовать эти функции; читаемость может быть нарушена для людей, которые не так знакомы. Кроме того, понятие for и понимание списка широко используются и понятны; хотя последний из функционального программирования, как и map, filter и reduce, он отображает списки и for петли довольно хорошо. В любом случае, забивание лямбды или определение функции, просто используемой с картой, фильтром или уменьшением, может раздражать, тем более, что лямбда может быть только одним выражением, а функция может загромождать ваш код. Они вам не нужны; map(func, seq) - это просто [func(x) for x in seq], а filter - это просто понимание списка с компонентом if. reduce может выполняться с помощью цикла for.

Короче говоря, for и понимание списков более ясны, и в большинстве случаев они обеспечивают в основном эквивалентную функциональность.