ГЛАВА 9. ИНСТРУКЦИИ ЦИКЛА В PYTHON

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

Вспомните, как мы решали задачу подсчета суммы элементов списка через вызов функции sum([1, 4, 5, 6, 7.0, 3, 2.0]) – всего лишь один вызов функции!

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

9.1. Инструкция цикла for

Например, у нас имеется список num и мы хотим красиво вывести на экран каждый из его элементов:

Если в списке будет пятьсот элементов?! Для подобных случаев в Python существуют циклы. Циклы являются движущей силой в программировании. Их понимание позволит писать настоящие живые и полезные программы!

Перепишем этот пример с использованием цикла for

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

На первом шаге переменной i будет присвоен первый элемент списка num, равный 0.8. Затем программа переходит в тело цикла for, отделенное отступами (четыре пробела или одна табуляция). В теле цикла содержится вызов функции print, которой передается переменная i.

На следующем шаге переменной i присвоится второй элемент списка, равный 7.0. Произойдет вызов функции print для отображения содержимого переменной i на экране и т.д. до тех пор, пока не закончатся элементы в списке!

В общем виде цикл for для перебора всех элементов указанного списка выглядит следующим образом:

Небольшой пример:

На самом деле, цикл for работает и для строк!

По аналогии со списком для строк перебираются все символы строки.

В общем виде запись цикла for для заданной строки:

Цикл for позволяет не только выводить элементы строки или списка на экран, но и производить над ними определенные операции:

Например, можем вывести на экран только заданное значение из списка, выполнив сравнение на каждом шаге цикла.

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

Напоминаю, что строковый метод isupper проверяет верхний регистр символа (С БОЛЬШОЙ ЛИ ОН БУКВЫ?), возвращает True или False. В цикле проверяется каждый символ строки. Если символ в верхнем регистре, то он выводится на экран.

9.2. Функция range

Достаточно часто при разработке программ необходимо получить последовательность (диапазон) целых чисел:

Для решения этой задачи в Python предусмотрена функция range, создающая последовательность (диапазон) чисел. В качестве аргументов функция принимает: начальное значение диапазона (по умолчанию 0), конечное значение (не включительно) и шаг (по умолчанию 1). Если вызвать функцию, то результата мы не увидим:

Дело в том, что для создания диапазона чисел необходимо использовать цикл for:

Таким образом, в переменную i на каждом шаге цикла будет записываться значение из диапазона, который создается функцией range.

При желании можно получить диапазон в обратном порядке следования (обратите внимание на аргументы функции range):

Теперь с помощью диапазона найдем сумму чисел на интервале от 1 до 100:

Переменной i на каждом шаге цикла будет присваиваться значение из диапазона от 1 до 100 (крайнее значение не включаем). В цикле мы накапливаем счетчик. Что это означает? На первом шаге цикла сначала вычисляется правая часть выражения, т.е. total+i. Переменная total на первом шаге равна 0 (присвоили ей значение 0 перед началом цикла), переменная i на первом шаге содержит значение 1 (первое значение из диапазона), таким образом, правая часть будет равна значению 1 и это значение присвоится левой части выражения, т.е. переменной total. На втором шаге total уже будет равна значению 1, i – содержать значение 2, т.е. правая часть выражения будет равна 3, это значение присвоится снова total и т.д. пока не дойдем до конца диапазона. В итоге в total после выхода из цикла будет содержаться искомая сумма!

9.3. Подходы к созданию списка

Рассмотрим различные способы создания списков. Самый очевидный способ:

В цикле из диапазона от 1 до 14 выбираем числа и с помощью спискового метода append добавляем их к списку a. С созданием списка из диапазона мы уже встречались:

Можно также использовать «списковое включение» (иногда его называют «генератором списка»):

Правила работы для спискового включения:

В следующем примере выбираем из диапазона все числа от 1 до 14, возводим их в квадрат и сразу формируем из них новый список:

Списковое включение позволяет задавать условие для выбора значения из диапазона (в примере исключили значение 4):

Вместо диапазонов списковое включение позволяет указывать существующий список:

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

В Python есть интересная функция map, которая позволяет создавать новый список на основе существующего списка:

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

9.4. Инструкция цикла while

Как вы уже догадались, цикл for используется, если заранее известно, сколько повторений необходимо выполнить (указывается через аргумент функции range или пока не закончится список/строка). Если заранее количество повторений цикла неизвестно, то применяется другая конструкция, которая называется циклом while:

Определим количество кроликов:

В результате выполнения программы:

В примере цикл while выполняется до тех пор, ПОКА число кроликов в условии положительное. На каждом шаге цикла мы переменную rabbits уменьшаем на 1, чтобы не уйти в бесконечный цикл, когда условие всегда будет являться истинным. Рассмотрим подробнее ход выполнения программы. В начале работы программы переменная rabbits равна 3, затем попадаем в цикл while, т.к. условие rabbits > 0 будет являться истинным (вернет значение True). В теле цикла вызывается функция print, которая отобразит на экране текущее значение переменной rabbits. Далее переменная уменьшится на 1 и снова произойдет проверка условия while, т.е. 2 > 0 (вернет True). Попадаем в цикл и действия повторяются до тех пор, пока не дойдем до условия 0 > 0. В этом случае вернется логическое значение False и цикл while не сработает.

Рассмотрим следующий пример:

В результате работы программы получим:

Программа выполняется в бесконечном цикле, т.к. True всегда является истиной. Внутри цикла происходит ввод значения с клавиатуры и проверка введенного значения. Инструкция break осуществляет выход из цикла. В подобных программах необходимо внимательно следить за преобразованием типов данных.

9.5. Вложенные циклы

Циклы можно вкладывать друг в друга.

Результат работы программы:

В примере цикл for сначала продвигается по всем элементам внешнего цикла (фиксируем i=1), затем переходит к вложенному циклу (переменная j) и проходим по всем элементам вложенного списка. Далее возвращаемся к внешнему циклу (фиксируем следующее значение i=2) и снова проходим по всем элементам вложенного списка. Так повторяем до тех пор, пока не закончатся элементы во внешнем списке:

Данный прием активно используется при работе с вложенными списками.

Сначала пример с одним циклом for:

Результат выполнения программы:

В примере с помощью цикла for перебираются все элементы списка, которые также
являются списками.

Если мы хотим добраться до элементов вложенных списков, то придется использовать вложенный цикл for:

Результат выполнения программы: