Как стать автором
Обновить

Комментарии 15

Правда, чаще всего их используют в форме, предусматривающей наличие единственного цикла for и, возможно, одного условия if. И это всё.

Потому что уже два уровня циклов требуют вчитывания, а что-то более сложное становится почти нечитаемым. Во всяком случае, на мой взгляд.

Плюсовики пишут на питоне =)
За такие штуки[y for y in (func(x) for x in values) if y] коллеги могут не просто косо посмотреть, но и что-нибудь в кофе подсыпать.

`any((value := number) > 10 for number in numbers)`

а за такое использование моржового равенства даже в неприличном месте побьют

print([func(x) for x in values if func(x)])         # хреново
print([y for y in (func(x) for x in values) if y])  # так себе
print([y for x in values if (y := func(x))])        # получше
print(list(filter(None, map(func, values))))        # вот так нормально

как же утомил  Martin Heinz своим недалеким видением. ну серьезно. Уже писал про это и вот опять.

Да есть брейки в листах или однострочниках, есть. Но ему похоже не дано.

[n for n in range(10) if n != 4 or next([])], кстати чет не работает. видать пофиксили

Сапрессер ошибок есть:

supress(f(*args, **kwargs)) or handle(*args, **kwargs), хотя в его примере там обработчик ошибки а не значния.

Ну и листы, листы, кругом листы. Эк меня на листы триггерит.

Эх... Люди старались, match в других языках подсматривали придумывали:

for v in values:
    match v:
        case True:
            result.append('yes')
        case False:
            result.append('no')
        case _:
            result.append('unknown')

Хотя можно сделать коротко и без списковых включений:

a = {True:'yes', False:'no', None:'unknown'}
for v in values:
  result.append(a[v])

А case _: равнозначно None разве?

Нет. Но у автора там тоже просто else.

Тут, скорее, вопросы к моему второму варианту. Который не совсем идентичен авторскому. Если возможные значения входных данных ограничены показанным набором - будет работать одинаково. Но если на вход придёт, например, 10 - будет ай-яй-яй.

- result.append(a[v])
+ result.append(a.get(v, 'unknown'))

Так будет работать эквивалентно авторскому =)

Лично мне очень нравится реализация перечислений БД в Tortoise ORM через генераторы.

имхо, "списочные выражения" как-то лучше звучит

"Однострочники Python: лаконичный и содержательный код [2022] Кристиан Майер"
Хорошая книга на эту тему.

Ну я так понимаю, что все примеры - это именно что "глядите, как можно", как в конце замечает сам автор.

Тогда нормально, забавно почитать. Главное, чтобы такое на работе не писали, а то на ревью вас всем отделом оттарабанят за тройные ифы в генераторах со всякими душными проверками какой-нибудь бизнес-логики.

Код должен не "занимать как можно меньше строк", а легко читаться, быть простым и понятным. Потому во всём надо знать меру и не перебарщивать

Спасибо за статью

Главное джунам не показывать эту статью.. а то они решать эти хаки и фичи в прод запустить )))

Зарегистрируйтесь на Хабре, чтобы оставить комментарий