Лекция №3. Алгоритмическая конструкция «Повторение»

Хорошевич Павел Александрович

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

Цикл while

В Python цикл с предусловием реализуется инструкцией while:

while <логическое выражение>:
    <инструкция 1>
    <инструкция 2>
    ...
    <инструкция N>

while

while
i = 0
while i < 5:
    print(i)
    i = i + 0.5

Циклом называется многократно выполняемая последовательность инструкций. Продолжение работы цикла зависит от некоторого условия.

Условие цикла - это логическое выражение, которое определяет продолжение или окончание работы цикла.

Тело цикла - набор инструкций, выполняемых в цикле. Один шаг цикла после выполнения тела цикла называется итерацией.

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

Цикл

Цикл

Бесконечный цикл

Если логическое выражение цикла while всегда имеет значение True, то такой цикл будет работать бесконечно.

i = 0
while i <= 10:
    print(i)

Цикл while с «часовым»

Чтобы сделать цикл интерактивным можно применить технику под названием цикл с «часовым» (sentinel loop).

Цикл продолжает обрабатывать данные до тех пор, пока на вход не поступит специальное значение. Это специальное значение и называется «часовым».

получить первый элемент данных
пока элемент не «часовой»:
    обработать элемент
    получить следующий элемент данных

Пример - сумма чисел

Пользователь вводит положительные числа. Определите, является ли введённое число чётным или не чётным. Работа программы прекращается после ввода нуля.

x = int(input("Следующее число (0 для остановки): "))
while x != 0:
    if x % 2 == 0:
        print(f"{x} - чётное число")
    else:
        print(f"{x} - не чётное число")
    x = int(input("Следующее число (0 для остановки): "))

Пример - валидация данных

Убедитесь, чтобы с клавиатуры было введено корректное значение возраста пользователя.

age = int(input("Введите ваш возраст: "))
while age <= 0:
    print("Возраст должен быть больше 0")
    age = int(input("Введите ваш возраст: "))

print(age)

Инструкция break

С помощью инструкции break можно прервать выполнение цикла и перейти к инструкциям расположенным после него.

while True:
    print("Эта строка появится на экране")
    break
    print("А эта строка?")

print("Цикл while завершил работу")

Инструкция continue

Инструкция continue прерывает выполнение текущей итерации цикла. Интерпретатор вернётся к проверке условия цикла.

x = 0
while x < 10:
    x = x + 1
    if x % 2 == 0:
        continue
    print(x)
    
print("Конец программы")

Объединим break и continue в одной программе.

while True:
    name = input("Имя пользователя: ")
    if name != 'admin':
        continue
    password = input('Привет, admin. Введите пароль:')
    if password == 'swordfish':
        break

print("Доступ разрешён!")

Пример

Напишите игру «Угадай число». Компьютер загадывает число от 1 до 10 и предлагает его отгадать. Компьютер сообщает пользователю больше или меньше число введённое пользователем относительно загаданного числа. Для получения случайного числа используется модуль random.

import random

num = random.randrange(1,11)

guess = int(input(">"))
guesses = 1

while num != guess:
    if num > guess:
        print("Задуманное число больше введённого")
    elif num < guess:
        print("Задуманное число меньше введённого")
    guess = int(input(">"))
    guesses = guesses + 1

print("Задуманное число:", num)
print("Количество попыток:", guesses)

Цикл с определённым количеством повторений

Цикл for

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

for <элемент> in <последовательность>:
    <блок инструкций>

элемент - переменная цикла. На каждой итерации цикла в переменной цикла будет находится очередной элемент последовательности.

for

for

Строка - это последовательность символов, значит с помощью цикла for можно перебрать все символы в строке. В следующем примере выведем на экран все символы строки Привет, мир:

Создание последовательности целых чисел

Последовательность целых чисел создаётся функцией range().

range(<конец>) # от 0 до <конец> - 1
range(<начало>, <конец>) # от <начало> до <конец>-1
range(<начало>, <конец>, <шаг>) # от <начало> до <конец>-1 с шагом <шаг>

Пример:

n = 5
for i in range(n):
    print(i)

Пример:

# вывести квадраты чисел от 1 до 10
for i in range(1, 11):
    sq = i ** 2
    print(i, sq)

range() с одним параметром

range() с одним параметром

range() с двумя параметрами

range() с двумя параметрами

range() с тремя параметрами

range() с тремя параметрами

range() c отрицательным шагом

range() c отрицательным шагом

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

# вывести квадраты чисел от 1 до 10
for i in range(1, 11):
    sq = i ** 2
    print(i, sq)

break и continue в цикле for

В цикле for, как и в цикле while можно использовать инструкцию прерывания цикла break и continue - переход к следующей итерации цикла.

Рассмотрим фрагмент кода:

for i in range(10):
    if i % 2 == 0:
        continue
    print(i)

Аккумулирование значений

Код от домофона состоит из четырёх цифр. Вы помните цифры кода (все цифры разные), но забыли в каком порядке они расположены. Сколько, в худшем случае, комбинаций этих цифр вам нужно перебрать, чтобы открыть дверь?

\[ 4!=4\cdot3\cdot2\cdot1=24 \]

\[ n!=n\cdot(n-1)\cdot...\cdot1 \]

Для нахождения факториала используем алгоритм с переменной-аккумулятором (накопителем):

инициализируем переменную-аккумулятор
цикл до получения результата:
    обновляем значение аккумулятора

Решение:

fact = 1 # переменная-аккумулятор
for num in range(4, 1, -1):
    fact = fact * num # обновление значения аккумулятора

Пример - сумма и произведение чисел

Найдите сумму и произведение чётных натуральных чисел меньше n и выведите её на экран. Число n вводится пользователем.

Решение:

n = int(input("Введите n: "))

s = 0 # аккумулятор суммы
p = 1 # аккумулятор произведения
for i in range(2, n, 2):
    s = s + i
    p = p * i

print(f"s={s}, p={p}")

Пример - среднее значение

задать сумме значение 0
задать счётчику значение 0
запросить ввод числа x
пока x больше нуля:
    прибавить x к сумме
    прибавить 1 к счётчику
    запросить ввод числа x
вывести сумма / счётчик
summ = 0
count = 0
x = int(input("Введите оценку> "))
while x >= 0:
    summ = summ + x
    count = count + 1
    x = int(input("Введите оценку> "))
print("Средняя оценка: ", summ / count)

Вопрос? Вопрос. Вопрос!

  1. Как называется один шаг цикла?
  2. С помощью какой функции создаётся последовательность чисел для их перебора циклом for?
  3. С помощью какого оператора можно прервать выполнение цикла?
  4. С помощью какого оператора можно пропустить итерацию цикла?
  5. Чем цикл for отличается от цикла while?

Какие последовательности чисел получатся:

  • range(5)

  • range(2, 8)

  • range(5, 10, 2)

  • range(10, 1, -2)

  • range(8, 1)

Шаблоны кода. Классификация переменных

Фиксированное значение

Значение

Значение

Значение переменной присваивается сразу после запуска программы или единожды после ввода значения с клавиатуры.

a = int(input("Введите длину: "))
b = int(input("Введите ширину: "))

S = a * b

Счётчик

Счётчик

Счётчик

Переменная последовательно принимает значения, принадлежащие известному набору (натуральные числа, положительные чётные числа и т.д.).

Ключевые слова: найдите количество, посчитайте, сколько…

a = [4, 6, 4, 3, 7]

#инициализация счётчика (обычно 0)
count = 0 
for i in range(0, 5):
    if a[i] > 0:
        #изменение счётчика(+1/-1)
        count = count + 1;
        
print(count)

Наиболее подходящее значение

Подходящее значение

Подходящее значение

Такая переменная хранит последнее найденное значение, подходящее под определённое условие.

Ключевые слова: найдите минимальный/максимальный…, найдите индекс…

a = [5, 6, 3, 6, 7]

min = a[0]

for i in range(1, 5):
    if a[i] < min:
        min = a[i]
        
print(min)

Аккумулятор

sum

sum

Переменная-аккумулятор накапливает в себе подходящие значения.

Ключевые слова: вычислите сумму/произведение…, измените содержимое строки…

Пример с числами:

a = [1, 2, 3, 4, 5]

# начальное значение аккумулятора
sum = 0 

for i in range(0, 5):
    # накапливание значений
    sum = sum + a[i]

print(sum)

Флажок

флаг

флаг

Флажок - это логическая переменная, которая может поменять своё значение на противоположное только один раз.

Ключевые слова: верно ли…, существует ли…, является ли…

a = [1, 4, 6, -1, 3]

flag = True # переменная-флаг
for el in a:
    if el < 0:
        flag = False
        break
        
print(flag)

Временное значение

Переменная считается временной, если её значение необходимо в течении короткого промежутка времени.

a = [1, 2, 3]

temp = a[0]
a[0] = a[2]
a[2] = temp