LINUX.ORG.RU

История изменений

Исправление 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 получаемого итератора проверяем необходимое постусловие. Или используем совет анонимуса, который как-то попроще будет в реализации.