Руководство по стилю 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
и понимание списков более ясны, и в большинстве случаев они обеспечивают в основном эквивалентную функциональность.