Почему Python для цикла не работает как C для цикла? - PullRequest
5 голосов
/ 21 января 2012

C:

# include <stdio.h>
main()
{
    int i;
    for (i=0; i<10; i++)
    {
           if (i>5) 
           {
             i=i-1;     
             printf("%d",i);
           } 
    }
}

Python:

for i in range(10):
   if i>5: i=i-1
   print(i)

Когда мы компилируем код C, он бесконечно циклично печатается 5, тогда как в Python этого нет, почемуне?

Выходные данные Python:

0 1 2 3 4 5 5 6 7 8

Ответы [ 4 ]

26 голосов
/ 21 января 2012

В Python цикл не увеличивается i, вместо этого он присваивает ему значения из итерируемого объекта (в данном случае, списка). Поэтому изменение i внутри цикла for не «запутывает» цикл, поскольку на следующей итерации i будет просто присвоено следующее значение.

В коде, который вы указали, когда i равен 6, он уменьшается в цикле, поэтому он изменяется на 5 и затем печатается. На следующей итерации Python просто устанавливает его на следующее значение в списке [0,1,2,3,4,5,6,7,8,9], которое равно 7 и т. Д. Цикл завершается, когда больше нет значений для принятия.

Конечно, эффект, который вы получаете в предоставленном вами цикле C, все еще может быть достигнут в Python. Поскольку каждый цикл for является прославленным циклом while, в том смысле, что его можно преобразовать следующим образом:

for (init; condition; term) ...

Эквивалентно:

init
while(condition) {
    ...
    term
}

Тогда ваш бесконечный цикл может быть записан на Python как:

i = 0
while i < 10:
    if i > 5:
        i -= 1
    print i
    i += 1
6 голосов
/ 21 января 2012

Обе конструкции называются циклами, но на самом деле они не одно и то же.

Версия Python - это цикл foreach. Он запускается один раз для каждого элемента в коллекции. range(10) создает список, подобный [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Таким образом, цикл for запускается один раз для каждого члена коллекции. Он не использует значение i при определении следующего элемента, он всегда принимает следующий элемент в списке.

Цикл c for переводится в эквивалент

int i = 0
while i < 10:
   ...
   i++;

Вот почему вы можете манипулировать i.

4 голосов
/ 21 января 2012

Поскольку ваши два примера совершенно разные вещи.

range(10) в python создает список значений 0 - 9, тогда for i in возвращает каждое значение как i.Обычно это называется циклом «для каждого».Вы работаете со значением, а не с итератором, когда говорите i=i-1 в своем примере с Python.

1 голос
/ 21 января 2012

http://docs.python.org/tutorial/controlflow.html

Оператор for в Python немного отличается от того, к чему вы привыкли в C или Pascal.Вместо того, чтобы всегда выполнять итерацию по арифметической последовательности чисел (как в Pascal) или давать пользователю возможность определять как шаг итерации, так и условие остановки (как C), оператор for Python for выполняет итерации по элементам любой последовательности (список илистрока), в том порядке, в котором они появляются в последовательности.Например (без каламбура):

a = ['cat', 'window', 'defenestrate']
for x in a:
    print x, len(x)

Не безопасно изменять итерируемую последовательность в цикле (это может происходить только для изменяемых типов последовательностей, таких как списки).Если вам нужно изменить список, который вы перебираете (например, для дублирования выбранных элементов), вы должны перебрать копию.

Конечно, последовательность, сгенерированная диапазоном, не является изменяемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...