(даже название этого будет создавать пламя, я понимаю)
Python сделал преднамеренный выбор дизайна, чтобы цикл for
использовал явные итерации с преимуществом значительно упрощенного кода в большинстве случаев.
Однако иногда бывает сложно создать итерабельность, если ваш тестовый пример и функция обновления сложны, и поэтому я нахожу, что пишу следующие циклы:
val = START_VAL
while <awkward/complicated test case>:
# do stuff
...
val = <awkward/complicated update>
Проблема заключается в том, что обновление находится в нижней части блока while
, что означает, что если я хочу, чтобы в нем был встроен continue
, я должен:
-
используйте повторяющийся код для сложного/awkard-обновления, AND
-
запускайте риск забыть об этом и имея бесконечный цикл кода
Я мог бы пройти маршрут ручной смены сложного итератора:
def complicated_iterator(val):
while <awkward/complicated test case>:
yeild val
val = <awkward/complicated update>
for val in complicated_iterator(start_val):
if <random check>:
continue # no issues here
# do stuff
Это поражает меня как waaaaay слишком многословным и сложным. У людей в переполнении стека есть более простое предложение?
Ответ на комментарии:
@Гленн Мейнард: Да, я отклонил ответ. Плохо писать пять строк, если есть способ сделать это в одном... особенно в случае, который появляется все время (цикл является общей чертой программ Turing-complete).
Для людей, которые ищут конкретный пример: скажем, я работаю с пользовательской библиотекой дат. Тогда мой вопрос будет, как бы вы выразили это в python:
for (date = start; date < end; date = calendar.next_quarter_end(date)):
if another_calendar.is_holiday(date):
continue
# ... do stuff...