Логические выражения, условные операторы и цикл
TODO лекция заняла ≈1час, можно дополнить
TODO добавить в лекцию пример на частичные вычисления (A and B при A=False)
Алгебра логики
Операции сравнения, тип bool, True и False
Алгебра логики над bool
or
and
A
B
A or B
A
B
A and B
False
False
False
False
False
False
False
True
True
False
True
False
True
False
True
True
False
False
True
True
True
True
True
True
Python3: and, or, not; низкий приоритет
- Пустые и непустые объекты Python3
- Алгебра логики над произвольными объектами Python3
- OR: если A истинно, результат истинен, вычислять B не надо
- ⇒ Python: если A истинно, результат равен A, иначе B
- AND: если A ложно, результат ложен, вычислять B не надо
- ⇒ Python: если A ложно, результат равен A, иначе B
⇒ частичное вычисление выражений A и B (например, 3+3 or 100/0)
or
and
A
B
A or B
A
B
A and B
Пусто
Пусто
B
Пусто
Пусто
A
Пусто
Непусто
B
Пусто
Непусто
A
Непусто
Пусто
A
Непусто
Пусто
B
Непусто
Непусто
A
Непусто
Непусто
B
- OR: если A истинно, результат истинен, вычислять B не надо
Сравнения
Простые: == , <, !=, >= и т. п.
is , in
- Многоместные
- Таким образом,
- wait шhат?
Условные действия
Конструкция a and b or c как замена тернарной операции a ? b : c в Си
Не работает, как ожидается, если b пусто
Условная операция выражение-True if выражение-условие else выражение-false
- Блоки
- Условный оператор:
оператор … if выражение: оператор оператор оператор … оператор
- Выражение: непустое (True) или пустое (False)
Отступы в блоке одинаковые (иначе ошибка)
- Условный оператор:
- Условный оператор (общий вид):
Если бы не было elif:
Оператор сопоставления (введение)
См. pep-0634, pep-0635 и pep-0636
Это довольно сложный оператор на сопоставление структуры объекта, здесь упомянем только функцию управления потоком вычислений и прямого связывания.
Если в шаблоне присутствует константа — это сопоставление
Если в шаблоне присутствует имя — это связывание (т. н. «связанная переменная»)
Шаблон в сопоставлении может сопровождаться фильтром — клаузой if с дополнительным условием (в том числе на связанные переменные)
Если связывание не нужно и жалко тратить имя, вместо имени можно использовать «_» — оно не запоминается в пространстве имён
Обратите внимание на то, что если в примере ввод равен "1", мы сам введённый объект теряем — он ничем не связан. Как быстрее всего задать имя введённого объекта?
Цикл с предусловием
- Каноническая схема цикла:
- например:
break, continue
Клауза else — не выполняется, если выход из цикла был по break:
Цикл while и операция связывания
В Python отсутствует цикл с пост-условием, потому что это было бы нарушение «блочного» принципа (cм. pep-0315). В результате стандартный шаблон «цикл по вводу» занимает все четыре секции канонической схемы цикла. В таких случаях естественно применить «моржовый оператор»:
переменная = ввод while проверка(переменная): тело переменная = ввод |
while проверка (переменная := ввод): тело |
Пример: цикл по вводу до пустой строки (ещё раз привет, Си!)
Коротко про ввод и вывод в Д/З
from math import * — математические функции
print() и print(…, end=концевая строка)
input()
int(input())/float(input())
eval(input()), что такое eval() и как работает
…в частности a, b, c = eval(input()) для ввода, например, трёх чисел 12, 15, 31
Д/З
Более подробные формулировки задач и интерфейс для их сдачи доступны по ссылкам вида «'Имя_задачи'»
Там же имеются советы по решению и могут появляться подсказки-спойлеры (доступны, если нажать «Комментарии» в шапке страницы). Кстати, на этой странице они есть.
Пользоваться составными типами данных Python (кроме преобразования ввода и множественного связывания) в этих задачах нельзя.
Прочитать и прощёлкать учебник (до функций)
EJudge: TriangleLine 'Неравенство треугольника'
Ввести три числа через запятую и вывести True или False в зависимости от того, могут ли эти числа быть сторонами треугольника (проверять строгое неравенство).
Условие: программа должна занимать одну строку.
2,8,3
False
EJudge: MaxSubsum 'Полоса удач'
Ввести в столбик последовательность целых (положительных и отрицательных) чисел, не равных нулю; в конце этой последовательности стоит 0. Вывести наибольшую сумму последовательно идущих элементов этой последовательности (не менее одного).
Условие: Использовать составные типы данных Python в этой задаче не разрешается.
2 3 -7 -1 3 4 5 -2 -4 7 8 -6 -1 0
21
EJudge: XorShift 'Пcевдослучайные числа'
Ввести четыре натуральных числа — state, n, a и b (a < b), и вывести псевдослучайное целое число в диапазоне от a до b включительно, вычисленное по формуле xorshift64 на n-м шаге алгоритма. Приведение к диапазону — это сумма остатка от деления на размер диапазона и начала диапазона.
Условие: использовать алгоритм с << 7 / >> 9 (самый простой, он описан в конце раздела)
1,7,10,20
16
EJudge: SwapFive 'Вращающееся число'
(Жак Арсак. Программирование игр и головоломок.) Для заданной цифры k найти такое минимальное целое неотрицательное число, оканчивающееся на k, что, умножая его на k, мы получим новое число, полученное из предыдущего вычеркиванием цифры k на конце и приписыванием ее в начале. Строки/кортежи и иные последовательности не использовать.
Условие: использовать составные типы данных Python в этой задаче не разрешается
4
102564