Логические выражения, условные операторы и цикл
Содержание предыдущей лекции
TODO Этот кусок нужен только в этом году из-за того, что предыдущей лекции не было
- Командная строка и REPL. Идея REPL; REPL и интерпретируемые языки; классика, IDLE, ptpython/ipython/bpython,…
- Объекты и выражения с ними; интерпретация выражения как последовательного создания/удаления объектов
- Связывание объектов; множественное связывание
- «Присваивание» как неатомарная операция «завести имя + связать объект»
Операция связывания «:=» и область её применения; понятие о «побочном эффекте»
- Связывание именами vs связывание элементами последовательности
Пространство имён и dir()/globals()
- Подсчёт ссылок и удаление объектов
- Кеш объектов, управление устареванием
- Определение и сборка мусора (например, кольцевые связи, не присутствующие ни в одном пространстве имён)
Алгебра логики
Операции сравнения, тип 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:
Оператор match
См. pep-0634, pep-0635 и pep-0636
Это довольно сложный оператор на сопоставление структуры объекта, здесь упомянем только функцию управления потоком вычислений и прямого связывания.
Если в шаблоне присутствует константа — это сопоставление
Если в шаблоне присутствует имя — это связывание (т. н. «свободная переменная»)
Если связывание не нужно и жалко тратить имя, вместо имени можно использовать «_» — оно не запоминается в пространстве имён
Обратите внимание на то, что если в примере ввод равен "1", мы сам введённый объект теряем — он ничем не связан. Как быстрее всего задать имя введённого объекта?
Цикл while
- Каноническая схема цикла:
- например
break, continue
Клауза else — не выполняется, если выход из цикла был по break:
Цикл while и операция связывания
Пример: цикл по вводу (ещё раз привет, Си!)
Или даже while (str := input()) != "END": …
Коротко про ввод и вывод в Д/З
from math import * — математические функции
print()
input()
int(input())/float(input())
eval(input()), что такое eval() и как работает
Д/З
Более подробные формулировки задач и интерфейс для их сдачи доступны по ссылкам вида «'Имя_задачи'»
Там же имеются советы по решению и могут появляться подсказки-спойлеры (доступны, если нажать «Комментарии» в шапке страницы).
Пользоваться составными типами данных Python (кроме преобразования ввода и множественного связывания) в этих задачах нельзя.
Прочитать и прощёлкать учебник (до функций)
EJudge: SquareEquation 'Квадратное уравнение'
Ввести через запятую три числа: a, b и c, вывести все вещественные решения уравнения $$ax^2+bx+c=0$$. При $$a\ne 0$$ это уравнение превращается в квадратное. Решения выводить через пробел в порядке возрастания, если решений нет, вывести 0, если их бесконечно много — -1.
1,-3,2
1.0 2.0
EJudge: DotBox 'Ящик с точками'
Вводить вещественные числа x, y и z по три в строке через запятую, считая их координатами точек (не менее одной тройки). Конец ввода — пустая строка. Вывести минимальный объём содержащего все точки параллелепипеда со сторонами, параллельными осям координат.
3,2,1 -1.5, -1.5, -1.5 1,-1.3,1 0,0.5,0 1,2,3 …
70.875
EJudge: MaxSubseq 'Длиннейшая подпоследовательность'
Вводить по одному непустую последовательность целых чисел, не равных нулю. Ноль означает конец в вода и не учитывается. Вывести наибольшую длину неубывающей подпоследовательности подряд идущих чисел исходной последовательности. Хранить введённую последовательность или её невырожденную подпоследоватиельность запрещается.
1 2 19 10 26 27 28 2 3 14 15 1 2 0
4
EJudge: SwapFive 'Вращающееся число'
(Жак Арсак. Программирование игр и головоломок.) Для заданной цифры k найти такое минимальное целое неотрицательное число, оканчивающееся на k, что, умножая его на k, мы получим новое число, полученное из предыдущего вычеркиванием цифры k на конце и приписыванием ее в начале. Строки/кортежи и иные последовательности не использовать.
4
102564