(Python) Циклы. Цикл со счетчиком - for


Циклы

Представим ситуацию, когда нам необходимо вывести на экран слово "Hello" 10 раз. Как нам поступить?
Можно взять и 10 раз написать команду print("Hello")
print("Hello")
print("Hello")
print("Hello")
print("Hello")
print("Hello")
print("Hello")
print("Hello")
print("Hello")
print("Hello")
print("Hello")

А что если надо не 10 раз, а 20, 30, 40 раз? А если 200 раз? В этом случае копирование займет очень много времени. А если необходимо, чтобы пользователь сам мог выбирать сколько раз ему необходимо вывести на экран какую-либо информацию? 

Справиться с такой задачей нам поможет специальная конструкция, которая называется цикл.
 
Цикл - это алгоритмическая конструкция, в которой некоторая последовательность команд повторяется несколько раз.

В большинстве языков программирования различают два вида циклов: цикл с переменной (for) и цикл с условием (while)
Начнем знакомство с циклами с первого вида.
 

Цикл с переменной, или с известным числом шагов (цикл for)

Очень часто бывает, что мы знаем число повторений каких-либо действий или же можем число повторений вычислить через известные нам данные. В некоторых языках программирования есть команда, которая на русском языке записывается командой
ПОВТОРИ (количество_повторений).

В этом случае мы можем указать конкретное число повторений. 
Интересно проследить, как работает этот цикл на машинном уровне:
1. в памяти выделяется определенная ячейка памяти и в нее записывается число повторений,
2. когда программа выполняет тело цикла один раз, содержимое этой ячейки (счетчик) уменьшается на единицу.
3. выполнение цикла заканчивается, когда в этой ячейке будет ноль.

В языке Python нет такой конструкции, но есть конструкция for.
 
Надо запомнить!
Общая форма записи оператора цикла for выглядит следующим образом:
for <переменная-счетчик> in <значения переменной-счетчика>:
    # тело цикла

1. Имя переменной-счетчика может быть любым (чаще используют букву i)
2. Тело цикла записывается со сдвигом вправо, относительно строки с заголовком цикла (for). По стандарту PEP8 сдвиг осуществляется на 4 пробела.
 
Посмотрим примеры как можно записать вывод слова "Hello" 10 раз.
 
Пример 1
for i in range(10): # для переменной i, изменяемой в диапазоне (in range) 
                    # от 0 до 10 (10 не включается)
    print("Hello")  # печатать Hello
Переменная - это счетчик выполненных итераций (шагов) цикла. В данном случае цикл выполняется для i = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. То есть ровно 10 раз.
Эту же программу можно записать по-другому.
 
Пример 2
for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
    print("Hello") 
В примере 2 мы перечисляем все значения переменной i, при которых необходимо выполнить цикл. При большом количестве значений удобнее использовать встроенную функцию range().
Последовательность значений, которую строит функция range() конечна. Цикл всегда закончится. 

Особенности работы цикла for

Как изменить шаг в последовательности значений и начинать не с нуля? Функция range() по умолчанию строит последовательность, в которой каждое следующее число на 1 больше предыдущего. Можно использовать функцию range в другой записи.

Общий вид записи функции следующий:
range([start], stop[, step])
  • start: число начала последовательности.
  • stop: генерирует числа до данного числа, но не включая его.
  • step: разница между каждым числом из последовательности (шаг)

Надо запомнить!
  • Все параметры должны быть целыми числами:
  • Каждый из параметров может быть, как положительным, так и отрицательным.
  • range() (и Python в целом) основана на индексе 0. Это означает, что список индексов начинается с 0, а не с 1.  Последнее целое число, сгенерированное функцией range() зависит от stop, но не будет включать его. Например, range(0, 5) генерирует целые числа 0, 1, 2, 3, 4, не включая 5.


Пример 1
for i in range (10, 0, -1):
    print(i*i)
Программа выводит квадраты натуральных чисел от 10 до 1 в порядке убывания
  • 10: первое число последовательности.
  • 0: конечное число последовательности (не включая это число).
  • -1: шаг


Пример 2
for i in range (0, 101, 5):
    print(i)
Программа выводит все числа от 0 до 100 с шагом 5
  • 0: первое число последовательности.
  • 101: конечное число последовательности (не включая это число).
  • 5: шаг

Повторить N-раз

Все программы с циклом for, которые мы до этого писали, нельзя назвать универсальными. Потому что мы сами задавали число повторений тела цикла. 
А что делать, если количество повторений будет зависеть от какого-либо другого значения? Например, пользователь сам хочет задать количество повторений цикла.
Что делать в этом случае?
Все очень просто. Вместо числовых начальных и конечных значений, мы можем использовать любые переменные, которые могут как вычисляться, так и задаваться пользователем.

Например, нам нужно вывести квадраты чисел от 1 до N, где значение переменной N вводится с клавиатуры пользователем.
Программа будет выглядеть следующим образом:
N = int(input())    # ввод N с клавиатуры
for i in range(1, N+1):    # цикл: для всех i от 1 до N  - переменная i 
                           # будет последовательно принимать значения от 1 до N
  print("square", i, "=", i*i)  # вывод квадрата числа

При входе в цикл выполняется оператор присваивания i = 1, и затем переменная i с каждым шагом увеличивается на единицу (i += 1). Цикл выполняется пока истинно условие i <= N. В теле цикла единственный оператор вывода печатает на экране само число и его квадрат по заданному формату.
Для возведения в квадрат или другую невысокую степень лучше использовать умножение.

Запустите программу и посмотрите результат ее работы при различных значениях переменной N.