Python: как вызвать позицию после перерыва из итерации по началу, остановке, пошаговому циклу

Я узнаю об итераторах и о том, как их использовать, и в процессе поставил вопрос. Можно ли вспомнить, где цикл прервался во время итерации (если цикл должен иметь условие разрыва, которое было выполнено), а затем забрать из вызванного места?

Пример того, что я говорю, у меня есть этот код:

print("Range() Test")
for i in range(10, 100, 10):
    if i == 60:
        print('Break Point')
        break
    print(i)
for i in range(10, 100, 10):
    print(i)

Который должен работать и дать вам что-то вроде этого:

Range() Test
10
20
30
40
50
Break Point
10
20
30
40
50
60
70
80
90

Мой первый вопрос:

1) Есть ли способ вспомнить позицию, где произошел перерыв, и начать оттуда, в отличие от моего неуклюжего стартапа? Я видел случаи, когда итерация проходила над списком элементов, но я не смог найти пример / отработать пример использования iter() в нотации start/stop/step.

2) Проводя исследования (я изучаю Python и много занимаюсь самообучением), я видел дескриптор функции range() и как итератор, и НЕ как итератор, поэтому, если у кого-то есть более точная информация по этому вопросу, в отличие от чтобы я вырвал новый для использования в моем примере, это было бы очень ценно.

Спасибо!

2 ответа

Решение

По твоему первому вопросу... Я думаю, ты на правильном пути. iter() сделает объект диапазона итератором. Он будет отслеживать себя, и вы можете выбрать, где вы были позже в вашем коде.

>>> x=iter(range(1,100,10))
>>> for i in x:
...     if i >30:
...             break
...
>>> for i in x:
...     print(i)
...
41
51
61
71
81
91

2) объекты диапазона не являются итераторами. Это делает большую работу по объяснению

Это вообще плохой дизайн. Если вы хотите продолжить с того места, где остановились, почему вы вообще отказываетесь от безопасности своей петли? Вы включаете разрушительную деятельность в этот условный блок.

print("Range() Test")
for i in range(10, 100, 10):
    if i == 60:
        print('Break Point')
    print(i)

В качестве альтернативы, сохраните столько состояния, сколько необходимо для перезапуска:

lower = 10
upper = 100
inc = 10

for i in range(lower, upper, inc):
    if i == 60:
        print('Break Point')
        break
    print(i)
old_i = i

for i in range(old_i, upper, inc):
    print(i)

Выход:

Range() Test
10
20
30
40
50
Break Point
60
70
80
90

~

Другие вопросы по тегам