Форум сайта python.su
Мне нужно, чтобы после того как выполнилось определённое условие, цикл for не начинал новый круг, а вернулся на предыдущий круг. Как это сделать?
Возможно не точно выразился.
s = str(input()) code = False for i in range(len(s)): try: if s[i]==s[i-1]: s = s.replace(s[i]*2,'') i-=2 print(s) continue except: pass print(s)
Отредактировано MEOW (Сен. 26, 2017 19:15:21)
Офлайн
Вы ни тот цикл используете. Вам нужен while со своим собственным внутри счетчиком и флагом выхода из цикла.
Офлайн
Я прекрасно понимаю реализацию через while, но сейчас мне интересен именно for. Возможна ли там реализация того, чего хочу?
Офлайн
Никак. Во-первых, цикл for вам этого не позволит (в общем случае), если только как-то очень хитро не переопределить __iter__ на итерируемом.
Во вторых, очень плохо (и почти всегда невозможно) менять итерируемое в процессе итерации.
(И вы даже от этого “защитились” завернув свой код в try-except (наверняка убегаете от IndexError`a))
В третьих, вы неправильно решаете задачу (какой бы она ни была)
Офлайн
MEOWда, как сказал предыдущий участник - если вы будете играться со своим итератором.
Возможна ли там реализация того, чего хочу?
Офлайн
MEOW
Вот вам пример исключительно в учебных целях
class MyIter: def __init__(self, end): self.current = -1 self.end = end def __iter__(self): return self def __next__(self): if self.current < -1: raise StopIteration() return self.next() def next(self): self.current += 1 if self.current >= self.end: raise StopIteration() return self.current def previous(self): self.current -= 2 return self.current def test_1(): assert [x for x in MyIter(3)] == [0, 1, 2] def test_2(): flag = False l = [] my_iter = MyIter(5) for value in my_iter: if not flag and value == 3: flag = not flag my_iter.previous() l.append(value) assert l == [0, 1, 2, 3, 2, 3, 4] def test_3(): l = [] my_iter = MyIter(3) for value in my_iter: my_iter.previous() l.append(value) assert l == [0]
Офлайн