Использование понимания списка для его побочных эффектов уродливо, непифонично, неэффективно, и я бы не стал этого делать. Вместо этого я бы использовал цикл for
, потому что цикл for
сигнализирует процедурный стиль, в котором важны побочные эффекты.
Но, если вы абсолютно настаиваете на использовании понимания списка для его побочных эффектов, вам следует избегать неэффективности, используя вместо этого выражение-генератор. Если вы абсолютно настаиваете на этом стиле, выполните одно из следующих действий:
any(fun_with_side_effects(x) and False for x in y if (...conditions...))
или
all(fun_with_side_effects(x) or True for x in y if (...conditions...))
Это выражения-генераторы, и они не генерируют случайный список, который отбрасывается. Я думаю, что форма all
, возможно, немного более понятна, хотя я думаю, что они оба сбивают с толку и не должны использоваться.
Я думаю, что это ужасно, и я бы не стал делать это в коде. Но если вы настаиваете на реализации ваших циклов таким образом, я бы так и сделал.
Я склонен считать, что списочные представления и их сходство должны сигнализировать о попытке использовать что-то, хотя бы слегка напоминающее функциональный стиль. Помещение вещей с побочными эффектами, которые нарушают это предположение, заставит людей более внимательно читать ваш код, и я думаю, что это плохо.