xam1816
С фильтром получается много вложенного, чем с генератором
А где у меня два раза int() происходит?
На генераторах оно будет вот так выглядеть
>>> (i for i in (int(i) for i in '123abcdef456' if i.isdigit()) if 1 < i < 5)
<generator object <genexpr> at 0x7f29942ccb48>
>>> list(_)
[2, 3, 4]
>>>
Чтобы прочитать это, сначала тебе надо будет долго искать самый внутренний генератор, докуда он там продолжается. Потом надо будет искать генератор вокруг этого самого внутреннего генератора, тоже максимально внимательно отыскивая его границы, чтобы не ошибиться и случайно не подумать не то. Потом снова и снова выходить изнутри наружу. Это уже похоже на операции, схожие с интегрированием сложной функции.
А с filter() ты сразу видишь, где там границы, потому что там не бывает каких-то разных filter(). У filter() всегда только два аргумента и всё.
А когда у тебя таких строк сто и писал их не ты, а какой-нибудь крендель, за которым надо проверять каждую букву, потому что он мог там ошибок понаделать в каждой строке, то скорость чтения такого кода играет вполне ощутимую роль. Или ты весь день будешь сидеть и читать этот отрывок кода, или за пятнадцать минут его прочитаешь, а остальное время будешь читать много других кодов.
Наличие filter() повышает читаемость кода, потому что все знают, как работает filter(), и прочитают его легко и однозначно. Наличие генераторного выражения снижает читаемость кода, потому что оно может быть произвольным, с множеством вложенностей и одинаковых имён на разных уровнях. И не всегда их пишут гении. Бывают их пишут такие дураки, что потом, когда они куда-то деваются, в вакансии на их место пишут “требуется человек, способный разбираться в чужом коде” - это вот такая кодовая фраза, означающая “у нас код писал какой-то дебил, а теперь мы его найти не можем, он куда-то на более тёплое место переехал, а там в его коде чота сломалось и мы даже не можем понять чо, помогите, спасите нас”.