240 подписчиков

Управление условием.

 Операторы условий  Почти все программы так или иначе должны проверять различные условия. В Python для проверки условий есть оператор if/else.

Операторы условий

Почти все программы так или иначе должны проверять различные условия. В Python для проверки условий есть оператор if/else.

Работает он в стандартной для подобных конструкций форме:

a = 5
if a < 10:
print("Я, великий Каа, вижу вы указали однозначное число")

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

name = "Константин"
if len(name) > 5:
print("Какое длинное имя, " + name + "!")
else:
print("К нам приходит " + name)

Как можно догадаться, блок "под" else будет выполнен, если условие у if оказалось ложным.

Кстати, обратите внимание, как мы посчитали длину строки name. Для этого используется встроенный оператор Phyton len, который возвращает длину списка (напомню, что строка — это список).

Вообще писать подходящие условия для if — это отдельная мини-тема, и мы подробнее посмотрим на нее в следующем модуле. Пока важно запомнить только то, что это условие булевое и всегда приводится к истина/ложь (они же True/False в Python). Это значит, что можно писать так:

name = "Константин"
name_is_long = len(name) > 5
if name_is_long:
print("Какое длинное имя, " + name + "!")
else:
print("К нам приходит " + name)

И вообще, если называть переменные так, чтобы по ним было понятно, что они означают, то можно писать понятный код, в котором будет меньше комментариев.

Более того, любое выражение в if будет неявно преобразовано в булевый тип, и этим тоже можно пользоваться:

month = 8
if month % 2:
print("Это нечётный месяц года")
else:
print("Это чётный месяц года")

В данном примере будет выведено сообщение, что месяц чётный, так как 8 % 2 будет равно нулю, а bool(0) - это False, то будет выполнена ветвь для else.

Множественное ветвление

Часто бывает так, что нам нужно делать ветвления больше, чем с одним вариантом. Можно либо писать вложенные условия, либо использовать форму elif (сокращенно от else if). Например, у нас есть блок кода, который говорит количество дней в месяце.Он может быть таким:

month = 7
all_months = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Ноябрь", "Декабрь"]
if month > 6:
if month % 2:
num_days = 31
else:
num_days = 30
else:
if month == 1:
num_days = 28
else:
if month % 2:
num_days = 30
else:
num_days = 31
print("В месяце " + all_months[month] + " " + str(num_days) + " дней")

Но, согласитесь, такую лесенку не очень удобно читать. Ее можно переписать с помощью elif. Это немного упростит код:

month = 7
all_months = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Ноябрь", "Декабрь"]

if month == 1:
num_days = 28
elif month > 6:
if month % 2:
num_days = 31
else:
num_days = 30
else:
if month % 2:
num_days = 30
else:
num_days = 31
print("В месяце " + all_months[month] + " " + str(num_days) + " дней")

Этот код можно еще немного упростить, но для этого нам надо еще кое-что узнать про булевые переменные.

Объединение условий

Часто надо сразу проверить несколько условий, чтобы понять, какое поведение выполнять. Для этого в языке Python используются специальные операторы and, or и not. Они работают как арифметические операции, но только для булевых типов, а не чисел.

not

Оператор not обращает значение выражения: True станет False, а False станет True:

v True False
not v False True

and

Чтобы проверить два условия и продолжить выполнение, только если оба условия истина, используем оператор and. Результат выражения с and будет True, только если оба элемента будут True.

or

Если нас интересуют два условия, но для продолжения выполнения достаточно, чтобы True был только один из них, то используем оператор or. Результат выражения с or будет False, только если оба элемента будут False, во всех других случаях это True.

Табличка для иллюстрации or и and

1 2 3 4

p T T F F
q F T F T

p and q F T F F
p or q T T F T

А еще, если не боитесь запутаться, вспомните, что False и True в мире чисел — это 0 и 1. Тогда можно сказать, что and — это умножение, а or — сложение. Если мы перемножаем нули и единицы, то единица (True) будет, только если мы перемножили две единицы. А вот для сложения ноль получится, только если мы сложили два нуля, во всех других случаях у нас получится 1 (или больше), что будет True.

Вернемся к нашему примеру. Мы писали код, который выводит число дней в месяце. Зная теперь про объединения условий, мы можем упростить этот код и сделать меньше вложенных блоков. Но для начала сделаем одно простое изменение.

Обратим внимание на то, что мы внутри блока с if/else выбираем, менять нам на 31 или на 30 (ну, или 28 в одном случае). Можно переписать логику всего блока так, что у нас по умолчанию num_days будет 31, и менять только его:

month = 7
all_months = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Ноябрь", "Декабрь"]
num_days = 31
if month == 1:
num_days = 28
elif month > 6:
if not (month % 2):
num_days = 30
else:
if month % 2:
num_days = 30
print("В месяце " + all_months[month] + " " + num_days + " дней")

Получается, если ни одна из проверок не прошла, то у нас num_days так и останется равным 31. Если же его надо поменять, то оно изменится на что-то подходящее.

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

Рассмотрим еще раз вот этот кусочек кода:

if month == 1:
num_days = 28
elif month > 6:
if not (month % 2):
if not (month % 2):
else:
if month % 2:
num_days = 30

Его можно еще ужать, используя наши знания про операторы and/or/not. Получится примерно так:

need_change_to_30 = ...
if month == 1:
num_days = 28
elif need_change_to_30:
num_days = 30

Вместо многоточия надо подставить логическое выражение с проверками на month.

Обратите внимание, что тут мы используем во втором случае elif, а не просто else, так как нам надо выполнить эту вторую ветвь, только если нам и правда нужно поменять значение на 30.

Работа с циклами

Цикл — это когда вы выполняете вроде одно и то же действие несколько раз. При этом действие может быть, как одинаковым (десять раз напечатать одну и ту же строчку), так и разным (десять раз напечатать следующий символ списка). Для циклов в Phyton есть два оператора: while и for. Сейчас мы разберем один, позже вернемся к другому.

Для перебора всех элементов последовательности используется следующий кусок кода:

course_by = "PythonWeb"
i = 0
while i < len(course_by):
print("* " + course_by[i] " *")
i = i + 1

Обратите внимание, у него три части: объявление — с чего начать, объяснение — что делать, и условие — когда остановиться. Не забудьте, кстати, строчку с i = i + 1, иначе условие будет выполняться всегда, и из цикла вы не выйдете. Если вам нужно прервать выполнение программы (например, вы угодили в бесконечный цикл или вам просто надоело), нажмите Ctrl+C.

Код выше можно переписать, используя метод "center" для строковых типов (попробуйте поменять число 30 на другое и посмотреть, что получится:

course_by = "PythonWeb"
i = 0
while i < len(course_by):
print("=" + course_by[i].center(30) "=")
i = i + 1