2015-04-20 4 views
0

Возможно ли изменить ваш итератор для циклов?Изменение итератора для циклов

Мой код не работает, как ожидалось (печать 0-9). Я могу сделать это с помощью цикла while, но ищет решение для цикла.

for r in range(0,10): 
    if(r==0): 
     print (0) 
     print (1) 
     print (2) 
     r = r+3 
    else: 
     print(r) 
+0

почему бы вам не ожидать 0 - 13? –

+0

Что вы ожидаете от вывода? –

+0

0-9, но печать 0-9 не является проблемой, изменяя итератор. –

ответ

3
for r in range(10): 
    print r 

Я думаю ... если предположить я понял ...

[править] О я, наконец, понял, что вы имели в виду ... ответ не на самом деле г reasigned каждый цикл

вы могли бы, однако повлиять на итератор

my_iter = xrange(10) 
for value in my_iter: 
    if value == 0: 
     print "A",value 
     print "B",next(my_iter) 
     print "C",next(my_iter) 
    else: 
     print value 
+0

нет, извините, но вы этого не сделали.Это простой пример: дело не в том, чтобы печатать числа от 0 до 10, это изменяет ваш итератор. –

3

Присваивание переменной цикла будет просто переписаны следующим итерация цикла. Переменная цикла является присваиванием, как и все остальное. Этот разговор PyCon 2015 может помочь объяснить детали: Python Names and Values.

+0

вы выяснили, что вопрос был до того, как я сделал: P (+1) –

+0

большое спасибо! –

4

Выполнение:

r = r+3 

не будет работать, как ожидалось, поскольку r присваивается значение только возвращенного итератора, а не сам итератора. Чтобы продвинуть итератор, вам нужно позвонить next.

Вы можете сделать это первым сохранение итератор в переменной и перекручивание над этим:

it = iter(range(0,10)) 
for r in it: 

Это позволит затем вызвать next на него внутри цикла:

it = iter(range(0,10)) 
for r in it: 
    if(r==0): 
     print (0) 
     print (1) 
     print (2) 
     for _ in range(3): # Advance the iterator by 3. 
      next(it) 
    else: 
     print(r) 

Примечание однако, как сказал @StevenRumbalski, вызывая next на пустом итераторе, поднимет исключение StopIteration. Иногда такое поведение желательно, но если нет, то вы можете указать значение по умолчанию для возврата:

next(it, None) 

Это позволит эффективно сделать линию не-оп.

+0

спасибо большое. но для _ в диапазоне (2) работает правильно. –

0

for r in range(0, 10) присваивает r каждой итерации. Это означает, что присваивания переменной цикла не будут сохраняться на следующей итерации.

Ваш для цикла эквивалентно:

it = iter(range(0, 10)) 
while True: 
    try: 
     r = next(it) 
    except StopIteration: 
     break 
    if(r==0): 
     print (0) 
     print (1) 
     print (2) 
     r = r+3 
    else: 
     print(r) 

Это r = next(it) задавливает любое задание вы сделали с именем r в предыдущих итераций. То же самое происходит неявно в вашем for-loop.

Если ваша конечная цель состоит в том, чтобы направить ваш итератор на определенное количество шагов, назовите next(it) количество раз, когда вы хотите его продвинуть (согласно запросу iCodez).

Смежные вопросы