2015-09-12 3 views
1

У меня есть одна проблема с Python. Я пытаюсь повторить цикл for более одного раза. У меня есть условие внутри цикла, и если условие истинно, цикл должен начинаться снова. Мне нужно решение только с одним для цикла. Например:Как повторить цикл for

for i in range (10): 
    if i==4: 
     i=0 
    print(i) 

К сожалению, это не сработало.

Вывод должен быть: 0 1 2 3 0 1 2 3 0 1 2 3...

+0

ОП, то, что вы пытаетесь сделать, звучит как плохая идея в целом. Структурированное программирование обычно не работает хорошо с 'goto',' continue' и 'break', что гораздо менее случайным образом работает с индексом цикла. На эту тему есть [знаменитая историческая статья] (https://en.wikipedia.org/wiki/Considered_harmful). Кроме того, рассмотрите 'print [x% 4 для x в диапазоне (10)]' для более питонического пути :) –

+1

@TobiaTesan Что не так с 'continue' и' break'? – mkrieger1

+0

@ mkrieger1, может быть, 'filter' и' next' являются лучшими абстракциями. –

ответ

2

Преобразование сквозными прочь переменной i 0, на нижнем уровне цикла не означает, что в следующей итерации переменная должна быть 0, потому что в каждой итерации питона переназначить его автоматически.

В качестве более вещий способ для таких задач, которые вы можете использовать itertools.cycle

>>> def range_printer(r,N): # r is the length of your range and N is the number of sequence printing 
...  a=cycle(range(r)) 
...  for i in range(N*r): 
...   print next(a) 
... 
>>> range_printer(4,3) 
0 
1 
2 
3 
0 
1 
2 
3 
0 
1 
2 
3 

Или вы можете использовать yield вернуть генератор:

>>> def range_printer(r,N): 
...  a=cycle(range(r)) 
...  for i in range(N*r): 
...   yield next(a) 
... 
>>> list(range_printer(4,3)) 
[0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3] 
+0

Еще itertools.cycle, вероятно, что OP хочет/должен использовать. –

+0

И вы не можете изменить i переменную, поскольку она динамически дается диапазоном. –

+1

Почему люди всегда говорят, что вы не можете изменить (переподтвердить)? Конечно вы можете. Перед печатью поставьте i до 8, и вы увидите 8 напечатанных. Единственное, что диапазон дает следующее значение независимо от того, что я установлен. – Veky

3

Ввод в переменную передачи контура в (i) внутри цикл всегда не является хорошей идеей (включая все языки, с которыми я знаком).

Попробуйте использовать время цикла вместо того, чтобы:

i = 0 
while i < 10: 
    i += 1 
    if i == 4: 
     i = 0 

Та же логика может быть реализована с:

while True: 
    for i in range(4): 
     print(i) 

или с помощью оператора по модулю, который является общим при езде на велосипеде:

i = 0 
while True: 
    print(i % 4) 
    i += 1 
+0

никаких модулей не импортировано ... приятно – repzero

2

a версия с использованием itertools.cycle:

from itertools import cycle 

for i in cycle(range(4)): 
    # put your logic that `break`s the cycle here 
    print(i) 
Смежные вопросы