Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 26, 2017 19:14:18

MEOW
Зарегистрирован: 2017-06-07
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Возвращение в предыдущий круг цикла for

Мне нужно, чтобы после того как выполнилось определённое условие, цикл 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)
Решил попробовать отнимать 2 от переменной i, но он не возвращается на предыдущий круг

Отредактировано MEOW (Сен. 26, 2017 19:15:21)

Офлайн

#2 Сен. 26, 2017 19:17:48

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Возвращение в предыдущий круг цикла for

Вы ни тот цикл используете. Вам нужен while со своим собственным внутри счетчиком и флагом выхода из цикла.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Сен. 26, 2017 19:21:32

MEOW
Зарегистрирован: 2017-06-07
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Возвращение в предыдущий круг цикла for

Я прекрасно понимаю реализацию через while, но сейчас мне интересен именно for. Возможна ли там реализация того, чего хочу?

Офлайн

#4 Сен. 26, 2017 19:27:42

Slow
Зарегистрирован: 2017-07-26
Сообщения: 88
Репутация: +  4  -
Профиль   Отправить e-mail  

Возвращение в предыдущий круг цикла for

Никак. Во-первых, цикл for вам этого не позволит (в общем случае), если только как-то очень хитро не переопределить __iter__ на итерируемом.
Во вторых, очень плохо (и почти всегда невозможно) менять итерируемое в процессе итерации.
(И вы даже от этого “защитились” завернув свой код в try-except (наверняка убегаете от IndexError`a))
В третьих, вы неправильно решаете задачу (какой бы она ни была)

Офлайн

#5 Сен. 26, 2017 21:23:57

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Возвращение в предыдущий круг цикла for

MEOW
Возможна ли там реализация того, чего хочу?
да, как сказал предыдущий участник - если вы будете играться со своим итератором.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Сен. 26, 2017 23:27:22

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Возвращение в предыдущий круг цикла for

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]



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version