Theory and Tasks for Students - Spring 2019
Операторы цикла WHILE и FOR

Допустим перед вами стоит простая задача - вывести все числа от 0 до 99. Можно было бы написать 100 строк с операцией вывода, но это не является оптимальным способом. Для многократного выполнения блока кода существуют циклы, например, условный цикл WHILE: while (logical_expression) : # блок кода Пока выражение возращает True, выполняется блок кода внутри.

Таким образом, для решения задачи с выводом чисел будет достаточно написать 4 строки: i = 0; while (i < 100) : print(i); i += 1; Запись a += b эквивалентна a = a + b. Имеются так же аналогичные операции -=, *=, /= и т.п.

Более сложный пример - следующий код считает сумму сходящегося ряда 1, 1/2, 1/4, 1/8 .. 1/N2: sum = 0; sumPrev = 1; i = 1; while (math.abs(sum - sumPrev) >= 1E-9) : sumPrev = sum; sum += 1.0 / i / i; i += 1; print(sum); Это и есть основной сценарий, при котором применяется условный цикл - неизвестное количество итераций.

В том случае, если число итераций цикла известно, используется цикл FOR: for i in range(a, b, c) : # блок кода Таким образом, i принимает значения на промежутке [a; b) с шагом c. Для цикла WHILE это бы записывалось так: i = a; while (a < b) : # блок кода i += c; Вывод чисел от 0 до 99: for i in range(0, 100, 1) : print(i);

Функцию range() можно вызывать и с меньшим количеством аргументов: range(a, b) эквивалентно range(a, b, 1), а range(b) эквивалентно range(0, b, 1). Кроме функции range() можно использовать и коллекции (массивы, строки и т.п.), тогда на очередной итерации переменная цикла будет принимать значения очередного элемента этой коллекции. Например, следующий код выводит строку с каждым символом через пробел: str = input(); strNew = ""; for c in str : strNew = c + " "; print(strNew); Таким образом, цикл FOR лучше использовать в тех случаях, когда количество итераций известно непосредственно перед выполнением цикла.

Часто возникает необходимость прервать выполнение всего цикла или отдельной итерации. Для этого существуют операторы break - выход из цикла, и continue - принудительный переход к очередной итерации. Таким образом, эквивалентными являются следующие блоки кода, выводящие чётные числа от 0 до N: for i in range(0, n + 1, 2) : print(i); for i in range(0, n + 1) : if (i % 2 == 0) : print(i); i = 0; while (i <= n) : if (i % 2 != 0) : continue; i++; print(i); i = 0; while (True) : if (i > n) : break; if (i % 2 != 0) : continue; i++; print(i); Это лишь демонстрация работы операторов - очевидно, если существует возможность написать более простой код, следует так и сделать, т.е. как в первом примере.

Оба оператора влияют лишь на непосредственно тот цикл, в котором они находятся. Например, следующий код выводит координаты все ячеек матрицы NxN ниже главной диагонали: for i in range(n) : for j in range(n) : if (j >= i) : break; print(str(i) + " " + str(j));

Позже для разных задач потребуется генерировать случайные числа. Это делается с помощью модуля random. В этом модуле имеется три основных функции:

  • random() возвращает случайное вещественное число на промежутке [0; 1)
  • randint() возвращает случайное целое число на промежутке [a; b]
  • randrange(a, b, c) возвращает случайное число на промежутке [a; b) с шагом c, аргументы a и c можно опустить так же, как в функции range()

Пример - расчёт числа Пи методом Монте-Карло: import random; n = int(input()); count = 0; for i in range(n) : x = random.random(); y = random.random(); if (x * x + y * y <= 1) : count += 1; print(count / n * 4);