Одно выполнение любого циклического процесса называется итерацией
While
while — цикл с условием повторения
# while - цикл с предусловием - условие повторяется перед итерациейпрограмма...while<условие>: делаем раз делаем двапродолжение программы# проверяется условие - если True, то выполнится тело цикла# дальше снова проверяется условие -# если True - снова выполнится тело цикла. И так до тех пор, пока условие# не станет False.# если условие False с самого начала - тело цикла будет проигнорировано.
a =0while a <5:# пока условие True - выполняем блок нижеprint(a) a +=1# 0# 1# 2# 3# 4
Бесконечные циклы
keep_going =Truewhile keep_going:print("I'm working")# этот цикл никогда не завершится, т.к. мы не меняем keep_going# важно продумывать условие выхода из цикла
Конструкция while True — способ использовать постусловие в while — то есть когда условие проверяется во время итерации, а не перед ней
N =10Sum =0whileTrue: Sum += N N -=1if N ==0:# вводим состояние, при котором нужно остановить циклbreakprint(f"Sum of First 10 Numbers is {Sum}")
Когда выполняется условие цикла while — до или после того, как он выполнит итерацию?
Сколько раз сообщение будет напечатано в первом примере? Сколько во втором?
# пример 1count =0while count >0:print("Привет, Мир!")# пример 2count =0while 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 inrange(6):print(f"Квадрат числа {number} равен {number ** 2}")# Квадрат числа 0 равен 0# Квадрат числа 1 равен 1# Квадрат числа 2 равен 4# Квадрат числа 3 равен 9# Квадрат числа 4 равен 16# Квадрат числа 5 равен 25
Что покажут фрагменты кода в примерах?
# пример 1for number inrange(0, 501, 100):print(number)# 0# 100# 200# 300# 400# 500
# пример 2for number inrange(10, 100, -10):print(number)
# пример 3for number inrange(1000, 100, -100):print(number)# 1000# 900# 800# 700# 600# 500# 400# 300# 200
Аккумулятор, или аккумуляторная переменная
s =0for num inrange(10): s +=1
total =0nums_count =5for num inrange(nums_count): total +=int(input("Введите число, которое хотите прибавить: "))print(f"Общая сумма составила: {total}")# Введите число, которое хотите прибавить: 5# Введите число, которое хотите прибавить: 4# Введите число, которое хотите прибавить: 3# Введите число, которое хотите прибавить: 2# Введите число, которое хотите прибавить: 1# Общая сумма составила: 15
Когда использовать while, а когда for?
while — когда мы не знаем, сколько итераций нам предстоит
for — когда мы знаем, сколько итераций предстоит
Валидация данных
Валидация данных — процесс проверки данных на корректность
Корректность данных определяет разработчик
Например, если по нашей задумке программа должна работать только с положительными числами, мы должны убедиться, что пользователь вводит положительное число — то есть мы должны провалидировать входные данные
score =int(input("Введите оценку за контрольную работу: "))while score <0or score >5:print("Ошибка: оценка не может быть отрицательной или выше 5") score =int(input("Введите правильную оценку: "))
Петр занимается торговлей. Он покупает товары по оптовой цене, делает
надбавку и продает по розничной, более высокой цене. Коэффицент надбавки
составляет 2.5. Так выглядит программа для добавления товаров:
Однако Петр стал замечать, что иногда в выводе появляются отрицательные
числа - видимо из-за опечаток сотрудников. Добавим валидацию данных для
программы:
Человеку необходимо подняться на 5-й этаж.
Сейчас он находится на первом этаже, между каждыми двумя этажами по 20 ступенек.
Пройдя 70 ступенек подряд, человек устает и останавливается, чтобы отдохнуть
floor =1energy =70print(f"I'm on the {floor} floor")while floor !=5: step =0while step !=20: step +=1 energy -=1if energy ==0:print("I'm tired, I will rest a little") energy +=70 floor +=1print(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 inrange(1, 10):# проитерироваться с 1 до 9for j inrange(1, 10):# в каждой итерации, т.е. при каждом значении i проитерироваться# с 1 до 9 при помощи переменной jprint(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 row inrange(5):for col inrange(6):print('*', end='')print()# *****# *****# *****# *****# *****# *****
for row inrange(8):for col inrange(row +1):print('*', end='')print()# *# **# ***# ****# *****# ******# *******
n =7for row inrange(n):for col inrange(n - row):print('*', end='')print()# *******# ******# *****# ****# ***# **# *
n =7for row inrange(n):print('#', end='')for col inrange(row):print(' ', end='')print('#')### ## ## ## ## ## #
Операторы break continue else
break — прерывает выполнение цикла
num =15for i inrange(num):if i ==5:breakprint(i)
continue — пропустить текущий цикл и перейти к следующему
for num inrange(40, 51):if num ==45:continueprint(num)
else — выполняется только тогда, когда выход из цикла был осуществлен НЕ через оператор break
for num inrange(5):print(num)else:print("Числа закончились")
i =0while i <5:print(i) i +=1else:print("Конец")
for num inrange(5):if num ==3:breakelse:print(num)else:print("Числа закончились")
i =0while i <5:if i ==3:breakelse:print(i) i +=1else:print("Конец")
Пример программы, которая предлагает пользователю угадать число от 1 до 20. Для прекращения работы с программой пользователь может ввести отрицательное число
from random import randintn =20to_be_guessed =randint(1, 20)guess =0while 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!")breakelse: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