Имап и Ифилтер против генератора понимания - PullRequest
0 голосов
/ 15 сентября 2011

Мне любопытны незначительные технические детали - различия между этими двумя во внутреннем представлении, производительности и подобных вещах Python.

1 Ответ

1 голос
/ 15 сентября 2011

Как правило, использование карт и фильтров не рекомендуется, но вы фильтруете карты только одной функцией, они полезны.Но никогда не используйте карту или фильтр с лямбдой. Рассмотрите это:

Места, где фильтр или карта лучше:

(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 карта ленива, она действует как выражение генератора.

...