Одно выполнение любого циклического процесса называется итерацией
While
while — цикл с условием повторения
# while - цикл с предусловием - условие повторяется перед итерацией
программа
...
while <условие>:
делаем раз
делаем два
продолжение программы
# проверяется условие - если True, то выполнится тело цикла
# дальше снова проверяется условие -
# если True - снова выполнится тело цикла. И так до тех пор, пока условие
# не станет False.
# если условие False с самого начала - тело цикла будет проигнорировано.
a = 0
while a < 5: # пока условие True - выполняем блок ниже
print(a)
a += 1
# 0
# 1
# 2
# 3
# 4
Бесконечные циклы
keep_going = True
while keep_going:
print("I'm working")
# этот цикл никогда не завершится, т.к. мы не меняем keep_going
# важно продумывать условие выхода из цикла
Конструкция while True — способ использовать постусловие в while — то есть когда условие проверяется во время итерации, а не перед ней
N = 10
Sum = 0
while True:
Sum += N
N -= 1
if N == 0: # вводим состояние, при котором нужно остановить цикл
break
print(f"Sum of First 10 Numbers is {Sum}")
Когда выполняется условие цикла while — до или после того, как он выполнит итерацию?
Сколько раз сообщение будет напечатано в первом примере? Сколько во втором?
# пример 1
count = 0
while count > 0:
print("Привет, Мир!")
# пример 2
count = 0
while count >= 0:
print("Привет, Мир!")
For
for — цикл со счетчиком повторений
Количество итераций известно заранее
# for - цикл cо счетчиком
программа
...
for <переменная> in [значение1, значение2 ...]:
делаем раз
делаем два
продолжение программы
# переменной перед каждой итерацией цикла присваивается значение из списка
# когда список закончится, произойдет выход из цикла
for name in["Tatyana", "Denis", "Vladimir", "Natalya"]:
print(len(name))
print(f"{name} " * 2)
# 7
# Tatyana Tatyana
# 5
# Denis Denis
# 8
# Vladimir Vladimir
# 7
# Natalya Natalya
for number in [0, 1, 2, 3, 4, 5]:
print(f"Квадрат числа {number} равен {number ** 2}")
# Квадрат числа 0 равен 0
# Квадрат числа 1 равен 1
# Квадрат числа 2 равен 4
# Квадрат числа 3 равен 9
# Квадрат числа 4 равен 16
# Квадрат числа 5 равен 25
Диапазоны чисел. Функция range()
range() создает итерируемый объект, пригодный для итеративной обработки в цикле
Принимает аргументы: начало, конец и шаг диапазона
При этом величина шага может быть отрицательной — тогда сгенерируется обратная последовательность
# генерация арифметической прогрессии - диапазона чисел
range(start, stop, step)
# start - число, с которого начинаем диапазон (по умолчанию 0)
# step - число, которым заканчиваем диапазон
# step - шаг диапазона (по умолчанию 1)
for number in range(6):
print(f"Квадрат числа {number} равен {number ** 2}")
# Квадрат числа 0 равен 0
# Квадрат числа 1 равен 1
# Квадрат числа 2 равен 4
# Квадрат числа 3 равен 9
# Квадрат числа 4 равен 16
# Квадрат числа 5 равен 25
Что покажут фрагменты кода в примерах?
# пример 1
for number in range(0, 501, 100):
print(number)
# 0
# 100
# 200
# 300
# 400
# 500
# пример 2
for number in range(10, 100, -10):
print(number)
# пример 3
for number in range(1000, 100, -100):
print(number)
# 1000
# 900
# 800
# 700
# 600
# 500
# 400
# 300
# 200
Аккумулятор, или аккумуляторная переменная
s = 0
for num in range(10):
s += 1
total = 0
nums_count = 5
for num in range(nums_count):
total += int(input("Введите число, которое хотите прибавить: "))
print(f"Общая сумма составила: {total}")
# Введите число, которое хотите прибавить: 5
# Введите число, которое хотите прибавить: 4
# Введите число, которое хотите прибавить: 3
# Введите число, которое хотите прибавить: 2
# Введите число, которое хотите прибавить: 1
# Общая сумма составила: 15
Когда использовать while, а когда for?
while — когда мы не знаем, сколько итераций нам предстоит
for — когда мы знаем, сколько итераций предстоит
Валидация данных
Валидация данных — процесс проверки данных на корректность
Корректность данных определяет разработчик
Например, если по нашей задумке программа должна работать только с положительными числами, мы должны убедиться, что пользователь вводит положительное число — то есть мы должны провалидировать входные данные
score = int(input("Введите оценку за контрольную работу: "))
while score < 0 or score > 5:
print("Ошибка: оценка не может быть отрицательной или выше 5")
score = int(input("Введите правильную оценку: "))
Петр занимается торговлей. Он покупает товары по оптовой цене, делает
надбавку и продает по розничной, более высокой цене. Коэффицент надбавки
составляет 2.5. Так выглядит программа для добавления товаров:
Однако Петр стал замечать, что иногда в выводе появляются отрицательные
числа - видимо из-за опечаток сотрудников. Добавим валидацию данных для
программы:
INCREASE = 2.5
keep_going = "да"
while keep_going == "да":
opt_cost = float(input("Введите оптовую стоимость товара: "))
while opt_cost <= 0:
print("Проверьте корректность введенной цены!")
opt_cost = float(input("Введите правильную оптовую стоимость товара: "))
retail = opt_cost * INCREASE
print(f"Розничная цена составляет: {retail:.2f}")
keep_going = input("Ещё есть товары? ")
Когда нужно валидировать данные?
Приведите пример валидации данных
Вложенные циклы
Человеку необходимо подняться на 5-й этаж.
Сейчас он находится на первом этаже, между каждыми двумя этажами по 20 ступенек.
Пройдя 70 ступенек подряд, человек устает и останавливается, чтобы отдохнуть
floor = 1
energy = 70
print(f"I'm on the {floor} floor")
while floor != 5:
step = 0
while step != 20:
step += 1
energy -= 1
if energy == 0:
print("I'm tired, I will rest a little")
energy += 70
floor += 1
print(f"Now I'm on the {floor} floor")
print("I've got to the right floor")
# I'm on the 1 floor
# Now I'm on the 2 floor
# Now I'm on the 3 floor
# Now I'm on the 4 floor
# I'm tired, I will rest a little
# Now I'm on the 5 floor
# I've got to the right floor
Во время каждой итерации внешнего цикла происходит выполнение всех итераций внутреннего цикла
for i in range(1, 10): # проитерироваться с 1 до 9
for j in range(1, 10):
# в каждой итерации, т.е. при каждом значении i проитерироваться
# с 1 до 9 при помощи переменной j
print(i * j, end="\t") # перемножить i и j для каждой итерации
print("\n") # по окончании каждого ВНЕШНЕГО цикла перейти на новую строку
# 1 2 3 4 5 6 7 8 9
# 2 4 6 8 10 12 14 16 18
# 3 6 9 12 15 18 21 24 27
# 4 8 12 16 20 24 28 32 36
# 5 10 15 20 25 30 35 40 45
# 6 12 18 24 30 36 42 48 54
# 7 14 21 28 35 42 49 56 63
# 8 16 24 32 40 48 56 64 72
# 9 18 27 36 45 54 63 72 81
for hours in range(24):
for minutes in range(60):
for seconds in range(60):
print(hours, ':', minutes, ':', seconds)
Графика при помощи вложенных циклов
for row in range(5):
for col in range(6):
print('*', end='')
print()
# *****
# *****
# *****
# *****
# *****
# *****
for row in range(8):
for col in range(row + 1):
print('*', end='')
print()
# *
# **
# ***
# ****
# *****
# ******
# *******
n = 7
for row in range(n):
for col in range(n - row):
print('*', end='')
print()
# *******
# ******
# *****
# ****
# ***
# **
# *
n = 7
for row in range(n):
print('#', end='')
for col in range(row):
print(' ', end='')
print('#')
##
# #
# #
# #
# #
# #
# #
Операторы break continue else
break — прерывает выполнение цикла
num = 15
for i in range(num):
if i == 5:
break
print(i)
continue — пропустить текущий цикл и перейти к следующему
for num in range(40, 51):
if num == 45:
continue
print(num)
else — выполняется только тогда, когда выход из цикла был осуществлен НЕ через оператор break
for num in range(5):
print(num)
else:
print("Числа закончились")
i = 0
while i < 5:
print(i)
i += 1
else:
print("Конец")
for num in range(5):
if num == 3:
break
else:
print(num)
else:
print("Числа закончились")
i = 0
while i < 5:
if i == 3:
break
else:
print(i)
i += 1
else:
print("Конец")
Пример программы, которая предлагает пользователю угадать число от 1 до 20. Для прекращения работы с программой пользователь может ввести отрицательное число
from random import randint
n = 20
to_be_guessed = randint(1, 20)
guess = 0
while guess != to_be_guessed:
guess = int(input("New number: "))
if guess > 0:
if guess > to_be_guessed:
print("Number too large")
else:
print("Number too small")
else:
print("Sorry, that you're giving up!")
break
else:
print('Congratulation!')
Практика
1. Напишите цикл while, который выводит числа от 0 до 100
2. Напишите цикл while, который позволяет пользователю ввести число. Число должно быть
умножено на 10 и результат присвоен переменной с именем product. Цикл должен
повторяться до тех пор, пока product меньше 1000. На экран выведите
количество пройденных циклов.
3. Пользователь вводит с клавиатуры два числа. Нужно показать все четные
числа в диапазоне между введенных чисел.
4. Напишите программу, вычисляющую сумму всех нечётных чисел в диапа-
зоне от до включительно (вводятся с клавиатуры).
5. Напишите программу, которая принимает от пользователя начало и конец
диапазона. На экран выводятся числа этого диапазона и квадратные корни этих
чисел с точностью до 2 знаков после запятой
6. Пользователь вводит с клавиатуры число. Требуется посчитать факториал
числа. Например, если введено 3, факториал числа 1*2*3 = 6.
Формула для расчета факториала: n! = 1*2*3...*n, где n - число
для расчета факториала.
7. Пользователь вводит с клавиатуры длину линии. Нужно отобразить на экране
горизонтальную линию из *, указанной длины. Например, если было введено 7,
тогда вывод на экран будет такой: *******.
8. Напишите программу, которая запрашивает у пользователя числа до тех
пор, пока каждое следующее число больше предыдущего. В конце програм-
ма сообщает, сколько чисел было введено.
9. Написать игру "Угадай число". Программа загадывает число в диапазоне от 1
до 500. Пользователь пытается его угадать. Сначала вводится загаданное
программой число, затем число, введенное пользователем.
После каждой попытки программа выдает подсказки - больше или меньше его число
загаданного. Предусмотреть выход по 0 в случае, если пользователю надоело
угадывать число.
Дополнительно *: Реализовать валидацию данных. Реализовать статистику - за
сколько попыток угадано число.
Дополнительно **: В статистике учитывать - сколько времени заняло угадывание.
Загаданное программой число должно быть случайным, т.е. выбираться случайным образом.
10. Создайте программу, играющую с пользователем в орла и решку. Программа
должна спрашивать у пользователя: орёл или решка. Если пользователь
вводит 0, то выбирает орла, 1 — решку, любое другое число — конец игры.
Программа должна вести учёт выигрышей и проигрышей и после каждого
раунда сообщать пользователю о состоянии его счёта. Пусть вначале на
счету 3 рубля и ставка в каждом коне 1 рубль. Если денег у пользователя
не осталось — игра прекращается.
Прим.: используйте модуль random для случайного выбора и функцию randint(a, b),
которая возвращает случайное целое число n, a <= n <= b