7  Условные и циклические алгоритмы

7.1 Классификация алгоритмов

В науке об алгоритмах выделяют три базовые алгоритмические конструкции, с помощью которых можно записать любую последовательность действий: следование, ветвление и цикл. Следование представляет из себя последовательность инструкций, выполняемых поочередно, одна за другой. Такой тип конструкции уже пройден. Ветвление представляет из себя несколько различных сценариев (последовательности команд), которые запускаются, если соблюдено некоторое условие. Цикл - это повторение некоторой последовательности действий либо заданное количество раз, либо пока соблюдается некоторое условие. Примеры схем этих конструкций представлена на Figure 7.1, Figure 7.2, Figure 7.3.

Figure 7.1: Блок-схема следования
Figure 7.2: Блок-схема ветвления
Figure 7.3: Блок-схема цикла

7.2 Условия

7.2.1 Классическое условие

Синтаксис условия представлен в Listing 7.1.

Listing 7.1: Синтаксис условного оператора
if condition:
    action1
    action2
elif condition1:
    action3
elif condition2:
    action4
else:
    action5
  1. Условие начинается с ключевого слова “если”, затем идет логическое выскаызвание и двоеточие
  2. Если первое условие не выполняется, идет проверка по цепи ветвления. elif сокращенно else if - “иначе если”
  3. Таких блоков может быть от 0 до бесконечности
  4. Если ни одно из условий не выполняется, то выполняется код в блоке else, который также является не обязательным
ВНИМАНИЕ!

Обратите внимание, что тело условия (код, который выполняется при соблюдении условия) остоит на некоторое количество отступов от самого условия!

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

Приведем пример программы, определяющую четность числа.

test_number = 10
if test_number % 2 == 0:
    print("Число четное")
else:
    print("Число нечетное")
Число четное

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

7.2.2 match-case

С версии Python 3.10 появился альтернативный способ записи условий, который применим, когда необходимо проверить одну переменную и в зависимости от её значение выполнить определенные действия. Разберем синтаксис на конкретном примере Listing 7.2.

Listing 7.2: Синтаксис оператора match-case
match value:
    case "load":
        load()
    case "save":
        save()
    case _:
        default()

После ключевого слова match идет имя проверяемой переменной или проверяемое выражение и двоеточие. Затем на один уровень отступа перечисляются варианты (ключевое слово case и двоеточие). Затем на ещё один уровень отступа перечисляются действия. case _ - конструкция, предназначенная для записи действий, когда не выполнилось ни одно из условий. Такая конструкция является гибкой в настройке и может проверять не только на равенство, но и на подчинение некоторому паттерну. Несмотря на то, что любое выражение match-case можно записать в виде if-else, в некоторых случаях match-case может быть более читаемым. Но следует помнить, что match-case в Python появился сравнительно недавно и более старые версии интерпретатора её не поддерживают.

7.3 Циклы

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

  • Параметрический цикл (цикл с счётчиком) - цикл выполняется строго определенное количество раз

  • Непараметрический цикл (цикл по условию)

    • Цикл с предусловием - проверка соблюдения условия выполняется перед каждым выполнением тела цикла

    • Цикл с постусловием - проверка соблюдения условия выполняется после каждого выполнения тела цикла

Одно выполнение тела цикла называют итерацией.

7.3.1 Цикл с счечиком

В других языках программирования счётчик - целочисленная переменная, указывающая на номер итерации. В питоне цикл с счетчиком служит для перебирания какого-либо итерируемого типа данных (т.е. типа данных, состоящего из нескольких простых типов данных, таких как числа, строки). Счетчик указывает не на номер итерации, а на текущее значение перебираемого элемента. В других языках такой цикл называется for-each (для каждого элемента). Пример показан на Listing 7.3. Допустим, у нас есть корзина с шарами разного цвета. В корзине может быть неизвестное нам заранее количество шаров и всегда переменное их количество, поэтому мы не можем просто взять и вывести их цвет написав функцию print несколько раз. Зато это может сделать цикл.

Listing 7.3: Синтаксис параметрического цикла
basket = ["black", "white","green", "red", "blue"]
for ball in basket:
    print(ball)
  1. “Корзина” с шарами. Такой тип данных называется список и будет разобран на следующем занятии.
  2. Объявление цикла. ball - переменная, которая хранит значение цвета шара на текущем шаге цикла. Такая переменная называется итератор
  3. Тело цикла - просто выводим значение цвета текущего шарика

Синтаксис цикла - for iterator in iterable_variable:

Для генерации числовых последовательностей используйте функцию range. Она работает в трёх режимах:

  • range(end) - от 0 до end, не включая end, с шагом 1.

  • range(start, end) - от start до end, не включая end, с шагом 1.

  • range(start, end, step) - от start до end, не включая end, с шагом step.

Напоминание

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

Выведем нечетные числа от 1 до 10.

for i in range(1,10,2):
    print(i)
1
3
5
7
9

Выведем нечетные числа от 1 до 10.

7.3.2 Цикл с предусловием

Бывают возникают ситуации, когда точное количество итераций невозможно предсказать, а цикл должен продолжаться до наступления какого-либо условия. Есть две стратегии: проверять наступление условия до начала новой итерации и после завершения итерации. Такие циклы называются с предусловием и с постусловием. Разница между ними в том, что цикл с постусловием обязательно выполниться хотя бы один раз. Такой цикл редко когда бывает нужен, поэтому в питоне есть только цикл с предусловием. Пример показан на Listing 7.4. Пока сумма чисел меньше 20, мы будем увеличивать i на 1.

Listing 7.4: Синтаксис цикла с предусловием
sum = 0
i = 0
while sum < 20:
    i += 1
    sum += i
  1. Синатксис объявления цикла while condition:
  2. Укороченная запись i = i + 1
Прерывание цикла

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

7.3.3 Условное прерывание итераций

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

  • break - досрочное завершение выполнения цикла

  • continue - досрочное завершение выполнения итерации, т.е. цикл не завершается, а переходит к следующему значению.

Приведем пример, например мы хотим, чтобы на экран выводились только четные числа в числовой последовательности range(1,20,3). Внимание, приведенный код служит всего лишь иллюстрацией использования оператора и решение задачи записывается проще.

for i in range(1,20,3):
    if i % 2 != 0:
        continue
    else:
        print(i)
4
10
16

7.4 Подведение итогов

  1. В питоне существуют конструкции для записи условного и повторяющегося выполнения кода
  2. В питоне два типа циклов: с счетчиком и с предусловием. 1 шаг цикла называется итерацией
  3. Тело условия, цикла и любой другой конструкции после двоеточия всегда начинается с нового отступа. Отступы должны быть одинаковые.
  4. Мы можем досрочно прервать либо итерацию, либо весь цикл

7.5 Задачи

Ограничения

Для решения задач запрещено использовать непройденный материал

  1. Напишите программу, которая выводит знак введенного с клавиатуры числа
  2. Усовершенствуете программу из п.1. Сделайте так, чтобы она работала до ввода 0.
  3. С помощью range выведете на экран последовательность от 1 до 50 включительно, причем четные числа умножайте на 2, а нечетные делите на 3.
  4. Напишите игру “Угадай число”. Компьютер загадывает число от 1 до 100. Пользователю даётся 10 попыток. При попытке пользователю выдается заключение: он угадал и выиграл, загаданное число больше или меньше введенного. По исчерпанию количества попыток, если пользователь не угадал число, игра должна сообщить о проигрыше и завершить свою работу.
  5. Напишите программу “Калькулятор”. Пользователь вводит математическое выражение и должен получить ответ. Поддерживаемые действия: сложение, вычитание, умножение и деление между двумя числами.
  6. Используйте циклы, чтобы вывести на консоль следующую фигуру:

  1. Выведите все простые числа в заданном пользователем интервале
  2. Вклад в банке составляет x рублей. Ежегодно он увеличивается на p процентов, после чего дробная часть копеек отбрасывается. Определите, через сколько лет вклад составит не менее y рублей.
  • Входные данные Программа получает на вход три натуральных числа: x, p, y (по одному числу в строке).

  • Выходные данные Программа должна вывести одно целое число.

  1. Последовательность состоит из различных натуральных чисел и завершается числом 0. Определите значение второго по величине элемента в этой последовательности.
  • Входные данные Вводится последовательность натуральных чисел, оканчивающаяся числом 0 (само число 0 в последовательность не входит, а служит как признак ее окончания).

  • Выходные данные Выведите ответ на задачу

  1. Реализуйте расчет факториала числа
  2. Реализуйте расчет n-члена последовательности Фибоначчи