Usar uma compreensão de lista para seus efeitos colaterais é feio, não Pythônico, ineficiente e eu não faria isso. Eu usaria um for
loop em vez disso, porque um for
loop sinaliza um estilo de procedimento no qual os efeitos colaterais são importantes.
Mas, se você absolutamente insiste em usar uma compreensão de lista para seus efeitos colaterais, deve evitar a ineficiência usando uma expressão geradora. Se você insiste absolutamente neste estilo, escolha um destes dois:
any(fun_with_side_effects(x) and False for x in y if (...conditions...))
ou:
all(fun_with_side_effects(x) or True for x in y if (...conditions...))
Essas são expressões geradoras e não geram uma lista aleatória que é descartada. Eu acho que oall
forma talvez seja um pouco mais clara, embora ache que ambas são confusas e não devam ser usadas.
Eu acho isso feio e eu não faria isso em código. Mas se você insiste em implementar seus loops dessa maneira, é assim que eu faria.
Tenho a tendência de achar que as compreensões de lista e de sua laia devem sinalizar uma tentativa de usar algo que se assemelhe pelo menos um pouco a um estilo funcional. Colocar coisas com efeitos colaterais que quebrem essa suposição fará com que as pessoas tenham que ler seu código com mais cuidado, e acho isso uma coisa ruim.