История изменений
Исправление Virtuos86, (текущая версия) :
А нужно, чтобы цикл бежал не до фиксированного значения, а до того, пока будет выполняться условие. Как это сделать?
Цикл for-in
по учебнику это обход итератора, то есть объекта, имеющего метод next
, и по факту, — одна из маленьких хитростей Python (из-за которых его ненавидят хэйтеры и обожают фанаты), — его запись представляет собой «сахарок», который можно раскрыть примерно так:
# это for-in
for i in obj:
...
# а это равноценный предыдущему циклу вариант
obj_iter = iter(obj): # или iter(<что-то, имеющее метод __iter__, который возвращает итератор по `obj`>)
while True:
try:
obj_iter.next()
...
except StopIteration: # исключение генерирует `obj_iter` при очередном вызове `next`, что свидетельствует о завершении обхода итератора
break
Собственно, к чему это? Если нужно постусловие в цикле, то а.) пишем свой obj
, умеющий выдавать итератор obj_iter
по себе, и б.) в методе next
получаемого итератора проверяем необходимое постусловие. Или используем совет анонимуса, который как-то попроще будет в реализации.
Исправление Virtuos86, :
А нужно, чтобы цикл бежал не до фиксированного значения, а до того, пока будет выполняться условие. Как это сделать?
Цикл for-in
по учебнику это обход итератора, то есть объекта, имеющего метод next
, и по факту, — одна из маленьких хитростей Python (из-за которых его ненавидят хэйтеры и обожают фанаты), — его запись представляет собой «сахарок», который можно раскрыть примерно так:
# это for-in
for i in obj:
...
# а это равноценный предыдущему циклу вариант
obj_iter = iter(<что-то, имеющее метод __iter__, который возвращает итератор по `obj`>)
while True:
try:
obj_iter.next()
...
except StopIteration: # исключение генерирует `obj_iter` при очередном вызове `next`, что свидетельствует о завершении обхода итератора
break
Собственно, к чему это? Если нужно постусловие в цикле, то а.) пишем свой obj
, умеющий выдавать итератор obj_iter
по себе, и б.) в методе next
получаемого итератора проверяем необходимое постусловие. Или используем совет анонимуса, который как-то попроще будет в реализации.
Исходная версия Virtuos86, :
А нужно, чтобы цикл бежал не до фиксированного значения, а до того, пока будет выполняться условие. Как это сделать?
Цикл for-in
по учебнику это обход итератора, то есть объекта, имеющего метод next
, и по факту, — одна из маленьких хитростей Python (из-за которых его ненавидят хэйтеры и обожают фанаты), — его запись представляет собой «сахарок», который можно раскрыть примерно так:
# это for-in
for i in obj:
...
# а это равноценный предыдущему циклу вариант
obj_iter = iter(<что-то, имеющее метод __iter__, который возвращает итератор по `obj`>)
while True:
try:
obj_iter.next()
...
except StopIteration: # исключение генерирует `obj_iter` при очередном вызове `next`, что свидетельствует о завершении обхода итератора
break
Собственно, к чему это? Если нужно постусловие в цикле, то а.) пишем свой obj
, умеющий выдавать итератор obj_iter
по себе, и б.) в методе next
получаемого итератора проверяем необходимое постусловие. Или используем совет анонимуса, который как-то попроще будет в реализации.