Циклы, как и условные операторы, составляют неотъемлемую часть структурного программирования. Благодаря ним можно повторно выполнять какие-либо блоки кода. Это востребовано довольно часто. Например, когда необходимо последовательно обрабатывать числа, введенные пользователем, и добавлять их к общей сумме, либо выводить на экран квадраты натуральных чисел.

Цикл while

Цикл "while" означает "пока" в контексте "пока есть это условие, выполняем те действия".

Считается, что цикл while является универсальным. Он присутствует в большинстве языков программирования, таких как Python, которые поддерживают структурное программирование. Его общий синтаксис для всех языков выглядит следующим образом:

while логическое_выражение {
    выражение 1;
    …
    выражение n;
}

Здесь наблюдается сходство с условными операторами if. Однако в отличие от них, тело цикла может выполняться многократно. Для if блок кода исполняется лишь раз, если логическое условие истинно. После этого выполнение программы продолжается ниже конструкции if.

Для while, после выполнения тела цикла, управление возвращается к его началу для проверки условия. При истинности условия тело выполняется снова, и так продолжается до тех пор, пока условие не станет ложным.

Цикл прекращается, когда его условие становится ложным, то есть выполнение цикла больше не оправдано. В этом случае программа выходит из цикла и продолжает выполнение кода ниже него.

Ниже приведена блок-схема цикла while.

Блок-схема цикла while

Основная логика программы обозначена голубыми прямоугольниками, в то время как заголовок цикла представлен ромбом, а тело цикла – бирюзовым прямоугольником.

При работе с циклом while могут возникнуть два исключительных случая:

  • Если при первой проверке цикла условие окажется ложным, тело цикла не будет выполнено ни разу. Это считается нормальным, так как в определённых ситуациях выполнение тела может быть не нужно.
  • Если условие while никогда не становится ложным, цикл будет бесконечно выполняться, если только в его теле нет команды принудительного выхода (break) или завершения программы — quit() или exit() в Python. Если цикл зацикливается бесконечно, программа может зависнуть без возможности самостоятельного завершения.

Напомним пример из урока про исключения, где пользователь должен ввести целое число. Так как функция input() возвращает строку, то ее необходимо преобразовать в целочисленный тип с помощью int(). В случае ввода неподходящих символов возникнет исключение ValueError, после чего программа завершится.

Другими словами, если программа подразумевала дальнейшую работу с числом (например, проверку на четность) и оно не было введено, единственным дальнейшим шагом было бы завершение программы.

Тем не менее, можно многократно попросить пользователя правильно ввести число, пока он не сделает это. Вот пример такого кода:

n = input("Введите целое число: ")

while type(n) != int:
    try:
        n = int(n)
    except ValueError:
        print("Неправильно ввели!")
        n = input("Введите целое число: ")

if n % 2 == 0:
    print("Четное")
else:
    print("Нечетное")

Примечание 1. Помните, что в Python в конце заголовков сложных инструкций всегда ставится двоеточие.

Примечание 2. В выражении type(n) != int используется функция type() для проверки типа переменной n. Если тип не int, то переменная n является строкой, что делает выражение истинным. Если же n равна int, то выражение ложное.

Примечание 3. В Python оператор % используется для нахождения остатка от деления. Четные числа делятся на 2 без остатка, результат ноль. Для нечетных чисел остаток равен единице.

Рассмотрим алгоритм работы программы: введенные данные, будучи строками, присваиваются переменной n. Заголовок while проверяет тип n. При первом входе в цикл тип n всегда строка, а не int, что делает выражение истинным и позволяет войти в тело цикла.

Внутри блока try происходит попытка преобразовать строку в целое число. Если она успешна, ветка except не выполняется, и цикл возвращает управление к заголовку while.

Теперь n – это целое число, и тип int соответствует: выражение type(n) != int возвращает ложь, завершая цикл. Затем выполнение программы переходит к оператору if-else. Здесь могла быть любая другая конструкция, не обязательно if-else.

Если преобразование в try не удалось и выбросило исключение ValueError, выполнение переходит к ветке except, запросив повторный ввод данных. Теперь n содержит новое значение.

После завершения except заголовок цикла снова проверяет логическое выражение. Оно возвращает True, так как n все еще строка.

Цикл завершается, когда n успешно преобразуется в число.

Теперь приведем еще один пример:

total = 100

i = 0
while i < 5:
    n = int(input())
    total = total - n
    i = i + 1

print("Осталось", total)

Сколько раз выполнится цикл? Пять итераций.

  1. Сначала i равно 0. Условие i < 5 истина, выполняется тело цикла. i увеличивается на 1.
  2. Теперь i равно 1. Это меньше пяти, тело цикла повторно выполняется, i становится 2.
  3. Два меньше пяти. Цикл исполняется в третий раз, i равно 3.
  4. Три меньше пяти. i становится 4.
  5. Четыре меньше пяти, выполняется тело цикла, i становится 5.

Шестая итерация начинается с проверки i < 5, условие ложное, цикл прекращается и его тело не выполняется.

Цель данного цикла – последовательное уменьшение переменной total на введенные числа. Здесь i служит счетчиком итераций цикла, а в других языках используется цикл for, так называемый "цикл со счетчиком". Преимущество for в том, что внутри тела цикла счетчик изменяется автоматически.

В Python также есть цикл for, но он не предполагает использование счетчика. Цель этого цикла – перечисление элементов последовательностей и других сложных объектов. Мы изучим его в следующих уроках.

Циклу while наличие счетчика не обязательно. Например, числа вводятся до тех пор, пока total положителен. Тогда код будет таким:

total = 100

while total > 0:
    n = int(input())
    total = total - n

print("Ресурс исчерпан")

Сколько раз выполнится цикл? Это зависит от вводимых значений, поэтому в цикле со счетчиком число итераций известно, а без счетчика – неизвестно.

Главное правило для цикла while – в его теле должны происходить изменения переменных, проверяемых в условии, чтобы в какой-то момент выражение в заголовке стало ложным. Иначе программа зациклится.

Примечание 1. В выражениях total = total - n и i = i + 1 можно использовать сокращенную запись: total -= n и i += 1 соответственно.

Примечание 2. Счетчик может изменяться произвольно. Например, чтобы вывести числа, кратные пяти от 100 до 0, итерирование будет выполняться с помощью i = i - 5 или i -= 5.

Примечание 3. Для счетчиков обычно используют переменные с именами i и j. Однако можно использовать любые названия.

Практическая работа

  1. Модифицируйте последний пример так, чтобы переменная total не принимала отрицательных значений. Например, если после вычитания она становится 25, и пользователь вводит 30, программа должна сообщить о невозможности выполнения действия и завершить цикл.
  2. Используя цикл while, выведите степени числа 2 от 0 до 20. Возведение в степень в Python обозначается символами **. Пример вывода:
...
  32
  64
 128
 256
 512
1024
...

Вопросы для самопроверки:

  1. Какова роль циклов в структурном программировании?
  2. Что произойдет, если условие в цикле while изначально ложно?
  3. Как предотвратить бесконечное выполнение цикла while?

Программа курса:

  1. Описание курса
  2. Эволюция и основы языков программирования

    История программирования в кратком и понятном изложении. Что такое машинный язык, почему появились ассемблеры, языки высокого уровня и объектно-ориентированные. Зачем нужен транслятор, и почему он может быть либо компилятором, либо интерпретатором.

  3. Знакомство с основами Python

    Особенности языка Python, работа в интерактивном режиме и подготовка файлов с исходным кодом.

  4. Типы данных и переменные в Python

    Базовые типы данных в Python: целое, вещественное числа, строки. Изменение типа данных с помощью встроенных функций. Понятие об операциях и переменных. Присваивание значения переменной.

  5. Ввод и вывод данных с Python функциями

    Для вывода на экран в Python 3.x используется функция print(). Вывод может быть предварительно отформатирован. Для ввода данных с клавиатуры используется функция input(), которая возвращает в программу строку.

  6. Логические выражения и операторы в Python

    Логические выражения. Логические операторы языка Python: == (равно), != (не равно), (больше), = (больше или равно), and (логическое И), or (логическое ИЛИ), not (отрицание).

  7. Ветвление и условные операторы в Python

    Управление потоком программы с помощью операторов if-else. Создание логических ветвлений, обработка условий и выполнение разных блоков кода в Python.

  8. Изучите обработку ошибок и исключений в Python

    Общее представление об ошибках и исключениях в языке программирования Python. SyntaxError, NameError, TypeError, ValueError, ZeroDivisionError. Обработка исключений с помощью инструкции try-except.

  9. Множественное ветвление с if-elif-else в Python

    Оператор множественного ветвления языка Python позволяет организовать более двух веток выполнения программы без необходимости вложения условных операторов друг в друга. Конструкция включает одну ветку if, произвольное количество elif и необязательную ветку else.

  10. Цикл while и его применение в Python

    С помощью циклов в программировании организуется многократное следующее друг за другом выполнение одних и тех же участков кода. Бывают циклы с условием и со счетчиком. К первым относится цикл while, или цикл "пока".

  11. Изучите функции и их применение в Python

    Функции - важный элемент структурного программирования. Они позволяют обособить участок кода, выполняющий определенную задачу. В дальнейшем к нему можно обращаться из разных мест программы по имени, которым он назван. В языке Python функции определяются с помощью оператора def.

  12. Локальные и глобальные переменные в Python

    В программировании важное значение имеет представление о локальных и глобальных переменных. Локальные переменные существуют внутри функций и не доступны за ее пределами. Глобальные переменные видны во всей программе.

  13. Оператор return и возврат значений в Python

    С помощью оператора return можно вернуть значение из тела функции в основную программу. В языке программирования Python можно вернуть несколько значений, перечислив их через запятую после оператора return. Также в функции может быть несколько return, но всегда выполняется только один из них.

  14. Параметры и аргументы функций в Python

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

  15. Встроенные функции Python для работы

    Язык программирования Python включает множество встроенных функций. В предыдущих уроках мы использовали такие функции как print() и input(), а также функции преобразования типов данных. В этом уроке рассматриваются встроенные функции для работы с символами и числами.

  16. Использование модулей в Python

    Использование модулей в программировании позволяет изолировать код, выполняющий частные задачи, в отдельные файлы. После чего обращаться к нему из разных программ. Создание модулей - следующий шаг после функций, когда участок кода обособляется внутри одного файла-программы. Для языка Python есть множество встроенных и сторонних модулей.

  17. Генерация псевдослучайных чисел в Python

    Для генерации псевдослучайных чисел в языке программирования Python используются функции модуля random. Функция random() генерирует вещественное число от 0 до 1. Функции randint() и randrange() производят целые псевдослучайные числа в указанных диапазонах.

  18. Изучение списков в Python - основы и операции

    Списки в Python - это аналог массивов в других языках программирования. Однако список может содержать элементы разных типов. В терминологии Python список - это изменяемая упорядоченная структура данных. Можно заменять его элементы, добавлять и удалять их, брать срезы. В язык встроены методы для работы со списками.

  19. Изучение цикла for в Python

    Цикл for в языке программирования Python предназначен для перебора элементов структур данных (списков, словарей, кортежей, множеств) и многих других объектов. Это не цикл со счетчиком, каковым является for во многих других языках. Нередко цикл for используется совместно с функцией range(), генерирующей объекты-диапазоны.

  20. Строки в Python - методы и срезы

    В Python строки - это неизменяемые последовательности символов или подстрок. Из них, так же как из списков, можно извлекать отдельные символы с помощью индексов или подстроки с помощью взятия срезов. В языке Python есть множество встроенных строковых методов, позволяющих упростить обработку строк.

  21. Кортежи - неизменяемые структуры данных

    Кортежи в Python - это неизменяемые структуры данных, состоящие из элементов одного или разных типов. Кортежи подобны спискам и обычно используются для защиты последних от изменений. Преобразование одного в другой выполняется с помощью встроенных функций tuple() и list().

  22. Словари в Python - работа с ключами и значениями

    Словарь в Python - это изменяемая неупорядоченная структура данных, элементами которой являются пары "ключ:значение". В словари можно добавлять и удалять элементы, изменять значения ключей. В Python словари имеют ряд методов, упрощающих работу с ними.

  23. Работа с файлами в Python

    В языке программирования Python открытие файлов выполняется с помощью функции open(), которой передается два аргумента - имя файла и режим. Файл может быть открыт в режиме чтения, записи, добавления. Также может быть указан тип файла - текстовый или бинарный. Для файлов есть ряд встроенных методов чтения, записи и др.