Ветвления и итерации
Этот урок нужно выполнять в редакторе коде. Проверим, что всё ок. Открой Visual Studio Code, нажми Ctrl+N, чтобы создать новый файл, набери print('hi')
, нажми Ctrl+S и сохрани куда-нибудь файл. Затем нажми зеленую стрелку справа-сверху, чтобы выполнить код.
Результат выполнения ты увидишь в терминале в самом редакторе. Если терминала нет, то нажми Terminal
→ New terminal
(внизу должен появиться встроенный терминал). Все, что будет далее в уроке, нужно выполнять таким же способом.
Очень редко программа просто выполняется линейно, построчно. При написании программ постоянно возникает необходимость выполнить какой-то кусок кода в зависимости от условия. Или выполнить какой-то кусок кода много раз. Для этого существуют конструкции управления потоком.
Ветвления (условия)
Логические типы
Логический тип — bool
. Если у числовых типов бесконечное количество значений, то у логического всего два: истина или ложь. True
или False
. Их ещё называют "булевы значения", что с английского переводится как логические.
Логические типы нужны для проверки на истинность какого-либо условия.
type(True) # bool
В питоне bool
является подтипом целых чисел и True
соответствует единице, а False
— нулю. Попробуй выполнить 1 + True
или 10 - False
Логический тип применяются для логических выражений, например, когда программа должна как-то реагировать в зависимости от срабатывания условия.
В питоне любой непустой объект — это True
. Также есть понятие "Falsy value" (что-то, что не False
, но похожее на False
) — это какое-то отсутствие значения. Например, None
или любой пустой объект: ''
, 0, [],()
, {}
, set()
.
Таким образом, проверить любое непустое значение можно так:
answer = 'yes'
if answer:
print(f'Ответ: {answer}')
Пример 2 + 2 == 4
вернет True
, это правда. 2 + 2 == 5
вернет False
, это неправда (ты конечно помнишь, что просто "равно" это оператор присваивания, а "двойное равно" — сравнения).
Операции сравнения
Например, можно сравнивать числа:
2 < 3
меньше
2 <= 2
меньше или равно
2 > 4
больше
2 >= 5
больше или равно
2 != 3
не равно
3 == 3
равно
0 <= 5 < 100
множественное сравнение, например верхняя и нижняя граница
Результатом сравнения будет логический тип данных — True
(если утверждение истинно) или False
(если утверждение ложно).
>>> 2 * 2 == 4
True # верно
Особое внимание следует уделить оператору сравнения ==
, "двойное равно". Не путай с =
, который является оператором присваивания, мы еще поговорим о нем позже.
Конвертация типов: bool()
Если мы попробуем преобразовать число к типу bool, и оно не равно нулю, то будет True, а так False.
Операторы and
, or
, not
, in
С помощью этих операторов мы можем строить сложные логические выражения, например x and y or z
Ещё можно задавать приоритет, с помощью скобочек.
Логические выражения "ленивы": если логическое выражение складывается раньше, то остальные условия не проверяются.
True or False — сразу True.
Оператор in
используется для проверки принадлежности. Можно проверить вхождение элемента в любую последовательность. У нас есть строка — это последовательность символов. Мы можем проверить вхождение подстроки в строку:
'avada' in 'avadakedavra'
True
Тип None
Тип None используется для обозначения "ничего". Значение, которое означает отсутствие значения.
В логическом значении None
интерпретируется как False
:
bool(None)
# False
Оператор if
Используется для выполнения каких-то блоков кода при выполнении условия.
В питоне блоки кода (вложенность) определяется отступами. В качестве отступов могут быть пробелы или Tab'ы, что иногда является причиной споров.
PEP8 строго рекомендует нам использовать пробелы, поэтому спорить тут не о чем. А ещё у тех, кто использует пробелы, выше зарплата, вот ссылка на исследование: https://stackoverflow.blog/2017/06/15/developers-use-spaces-make-money-use-tabs/
Условные конструкции состоят из обязательной части if какое-то условие:
, затем следует блок кода (который как мы только что выяснили определяется отступом), опционально можно добавить сколько угодно ещё elif
'ов, это дополнительные иф'ы. Ещё в условной конструкции может быть необязательный блок else
, который сработает если условие ложно:
if 'Миша' in python101_students:
print('Привет, Миша')
elif 'Катя' in python101_students:
print('Привет, Катя')
else:
print('Привет')
Условие может быть сложным: or
, and
и так далее.
Условие выполняется в том случае, если оно True
.
В питоне есть тернарный оператор. Он записывается в одну строчку. Может быть удобно, когда нужно что-то простое.
Синтаксис такой: результат if условие else другой-результат
argentina_score = 5
jamaica_score = 0
winner = 'Аргентина' if argentina_score > jamaica_score else 'Ямайка'
В переменную winner
запишется та команда, у которой счет больше.
Итерации (циклы)
Циклы приходят на помощь, когда нужно выполнить какой-то блок кода много раз, или когда нужно выполнять блок кода, пока выполняется какое-то условие. Или когда нужно пройтись по каким-то последовательностям и что-то с ними сделать.
Цикл for
Цикл for создает временную переменную при переборе какой-то последовательности.
Иногда нужно проитерироваться по какой-то последовательности. Это может быть строка, список и так далее. Мы можем что-то сделать для каждого из элементов этой последовательности. Для этого нужен цикл for
:
sentence = 'Я сегодня Joy Division — на диване неподвижен.'
for char in sentence:
print(char)
Уничтожается ли временная переменная после завершения цикла? Проверь.
Если не хотим итерироваться по чему-то конкретному, то можно воспользоваться функцией range()
для генерации числовой последовательности. range(3)
— 0, 1, 2 не включительно. Можно с двумя аргументами — начиная и заканчивая. Не включительно. Ну и шаг третьим аргументом, как с индексами.
for number in range(1, 99):
print(number)
pass
— пустой блок, который ничего не делает. можно использовать в качестве заглушки. Вот цикл, который ничего не делает:
for i in range(1, 99):
pass
Бесполезная программа: итерируемся и ничего не делаем.
С циклами очень часто используются два оператора:
Оператор break
. Выйти из цикла досрочно. Используется, когда нужно завершить цикл досрочно.
Оператор continue
. Позволяет перейти к следующей итерации, не выполняя кусок кода ниже в блоке. Или когда нужно пропустить элемент в цикле.
Цикл while
Этот цикл выполняет блок кода, пока заданное условие остаётся истинным.
Синтаксис while такой:
while какое-то-условие:
блок кода
Результат условия должен быть равен True или False. В случае True будет выполнен блок кода, который вложен в цикл, в случае False завершит работу. Пример:
counter = 10
while counter > 0:
print(counter)
counter -= 1
Мы создаём переменную counter. Цикл while начинает работу, и проверяет условие counter > 0, на первой итерации это 10 > 0, то есть True. Выполняется блок кода — выводится на экран значение counter и вычитается 1. На второй итерации counter > 9 (мы же вычли 1), всё повторяется. На последней итерации значение counter равно 0, условие не выполняется и цикл завершается.
Цикл while иногда делают бесконечным, снабжая оператором break
:
while True:
answer = input()
if 'exit' in answer:
break
Теперь практика!
Практика
Задание 1
Программа оценивает сложность пароля. Просит ввести пароль и выводит на экран сообщение о его сложности. Сложным считается пароль, состоящий как минимум из 8-ми символов, включая цифры и алфавитные символы.
Задание 2
Программа выводит на экран числа от 1 до 100 включительно, каждое число с новой строки.
Если число кратно трём, то вместо этого числа программа выводит слово "zip"
Если чисто кратно пяти, то вместо этого числа выводится слово "zap"
Если число кратно пятнадцати, то вместо этого числа выводится слово "zip-zap"
Тебе понадобится цикл for и ветвления, это подсказка.
Задание 3
Напиши программу, которая генерирует (псевдо)случайное положительное число от 0 до 1000000 (одного миллиона) и предлагает пользователю угадать это число.
Программа должна приветствовать пользователя и считывать число с клавиатуры. Если число меньше загаданного, то программа выводит сообщение о том, что число меньше, если больше загаданного, то программа выводит сообщение о том, что число больше загаданного.
Программа должна выводить сообщения-предупреждения, если:
- пользователь ввёл не число
- число не входит в обозначенный в условии диапазон
Если пользователь ничего не ввёл или ввёл "exit", то происходит выход из программы.
Тебе понадобится модуль random, цикл while и ветвления. Также почитай про бинарный поиск, это подсказка.