Почему цикл for выполняется на один раз больше, чем тело цикла?

В книге Introduction to Algorithms есть строка под заголовком Анализ сортировки вставками, которая гласит:

«Когда цикл for или while завершается обычным образом (т. е. из-за теста в заголовке цикла), тест выполняется на один раз больше, чем тело цикла».

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

for j in range(0,3): print(j)

в питоне получаем результат:

0

1

2

Итерирующая переменная j проходит только через значения 0, 1 и 2. Таким образом, цикл for и тело цикла выполняются только трижды.

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

Однако я считаю, что OP перепутал механизм цикла for с циклом while. Ответы на вопрос, похоже, подтверждают его заблуждение.


person Shiladitya Mukherjee    schedule 17.07.2019    source источник


Ответы (2)


Это связано с тем, что всегда выполняется на одну оценку условия цикла больше, чем выполняется тело цикла.
Возьмем такой простой пример:

x = 4
while x < 0:
    x += 1
    print('hello')

Мы видим, что тело цикла никогда не выполняется (0 раза), а условие выхода цикла вычисляется один раз (1 раз).
Итак, в любой ситуации мы имеем следующее:
Тело цикла выполняется один раз каждый раз, когда условие оценивается как True
И
Условие еще раз оценивается как False, чтобы программа вышла из цикла.

person m.raynal    schedule 17.07.2019
comment
Я думаю, что да, может быть, ваш вопрос не сформулирован так ясно. Дело в том, что нет такой вещи, как выполнение цикла for. Вы можете выполнить его тело, вы можете оценить его состояние, но вы не выполните цикл - person m.raynal; 17.07.2019
comment
У меня есть путаница в механизме цикла for. Я понимаю, как работает цикл while. Я ясно заявил, что это было причиной путаницы в вопросе, ссылку на который я предоставил. Там, на мой взгляд, ОП перепутал цикл while и цикл for. - person Shiladitya Mukherjee; 17.07.2019
comment
Тогда может быть полезно рассмотреть цикл for на другом языке, таком как C или java. Они используют форму с 3 аргументами (инициализация, итерация, конечное условие), что позволяет лучше понять, как они работают. В приведенном вами примере вы используете range, который является своего рода генератором, а повторение генератора — это еще одна история. В python for использует синтаксические сахара, чтобы сделать его красивым, не позволяя читателю увидеть, что на самом деле происходит в деталях. - person m.raynal; 17.07.2019
comment
Теперь, когда я немного изучил C++, я полностью понимаю вашу точку зрения. :D - person Shiladitya Mukherjee; 12.12.2019

В вашем примере Python do_something() в цикле

for j in range (0,n):
    do_something()

выполняется n-1 раз, поскольку верхняя граница диапазона не включает. Таким образом, он будет выполнен, когда j=0, j=1, ... j = n-1. Сам цикл выполнится еще раз (т. е. когда j=n) и увидит, что значение больше не находится в диапазоне, и не будет выполнять тело.

Вот почему цикл for выполняется на один раз больше, чем тело.

Те же рассуждения, конечно же, применимы и к циклам for.

person Matthew I    schedule 17.07.2019
comment
Я думал, что цикл for работает так: когда вы достигаете j=n-1, do_something и выходите из цикла. Таким образом, цикл for и тело цикла выполняются одинаковое количество раз. - person Shiladitya Mukherjee; 17.07.2019
comment
Нет, цикл for выполнит условие выхода, чтобы разорвать цикл. Это условие выхода было бы, когда j больше не находится в диапазоне. В этом случае, как только j = n, цикл for увидит, что j больше не находится в диапазоне (поскольку верхняя граница не включает), и выполнит условие выхода и остановится. - person Matthew I; 17.07.2019