filter и map с lambda
Почему list(filter(lambda x: ..., xs)) обычно пишут включением.
Две записи одного
list(filter(lambda x: x > 0, chisla))
[x for x in chisla if x > 0]
Вторая короче и читается слева направо как фраза: «взять x из чисел, если x больше нуля».
В первой приходится читать изнутри наружу и держать в голове, что
делает filter.
То же с map
list(map(lambda c: c * 2, ceny))
[c * 2 for c in ceny]
Когда map всё-таки лучше
Когда функция уже есть и не надо писать lambda:
list(map(str, chisla)) # понятно и коротко
[str(c) for c in chisla] # не хуже, но длиннее
Правило простое: есть готовая функция — map уместен; нужна
lambda — берите включение.
Генератор вместо списка
Если результат сразу складывается или перебирается, скобки не нужны вовсе:
sum(c * 2 for c in ceny) # ничего не накапливается
sum([c * 2 for c in ceny]) # сначала строит список из всех
На сотне значений разницы нет. На миллионе первый вариант не строит миллион чисел в памяти.
Поэтому внутри sum, max, any, all и join квадратные скобки
обычно не ставят.