Как правило, использование карт и фильтров не рекомендуется, но вы фильтруете карты только одной функцией, они полезны.Но никогда не используйте карту или фильтр с лямбдой. Рассмотрите это:
Места, где фильтр или карта лучше:
(i for i in iterable if i), filter(bool, i)
(int(i) for i in iterable), map(int, i)
Видите, они проще.Но учтите следующее:
(i+3 for i in iterable), map(lambda i: i+3, iterable)
(i for i in iterable if i.isdigit()), filter(lambda i, i.isdigit(), iterable)
И еще одно преимущество для выражений генератора: вы можете смешивать функциональность карты и фильтра.
(f(i) for i in iterable if g(i)), map(f, filter(g, iterable))
Для меня правила таковы:
- Никогда не используйте лямбду в карте или фильтре.
- Используйте карту или фильтр, только если очевидно, что вы делаете.
- Для всего остального используйте выражения генератора.
- Если сомневаетесь, используйте выражения генератора.
Редактировать:
Забыл одну важную вещь:
На версиях Python старше 3, карта(и фильтр) стремится, так что лучше сравнить его со списком.Но в Python 3 карта ленива, она действует как выражение генератора.