Логические выражения, условные операторы и цикл
Содержание предыдущей лекции
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 'Квадратное уравнение' Input:- Ввести через запятую три числа: a, b и c, вывести все вещественные решения уравнения $$ax^2+bx+c=0$$. При $$a\ne 0$$ это уравнение превращается в квадратное. Решения выводить через пробел в порядке возрастания, если решений нет, вывести 0, если их бесконечно много — -1. Output:- 1,-3,2 - 1.0 2.0 
- EJudge: DotBox 'Ящик с точками' Input:- Вводить вещественные числа x, y и z по три в строке через запятую, считая их координатами точек (не менее одной тройки). Конец ввода — пустая строка. Вывести минимальный объём содержащего все точки параллелепипеда со сторонами, параллельными осям координат. Output:- 3,2,1 -1.5, -1.5, -1.5 1,-1.3,1 0,0.5,0 1,2,3 … - 70.875 
- EJudge: MaxSubseq 'Длиннейшая подпоследовательность' Input:- Вводить по одному непустую последовательность целых чисел, не равных нулю. Ноль означает конец в вода и не учитывается. Вывести наибольшую длину неубывающей подпоследовательности подряд идущих чисел исходной последовательности. Хранить введённую последовательность или её невырожденную подпоследоватиельность запрещается. Output:- 1 2 19 10 26 27 28 2 3 14 15 1 2 0 - 4 
- EJudge: SwapFive 'Вращающееся число' Input:- (Жак Арсак. Программирование игр и головоломок.) Для заданной цифры k найти такое минимальное целое неотрицательное число, оканчивающееся на k, что, умножая его на k, мы получим новое число, полученное из предыдущего вычеркиванием цифры k на конце и приписыванием ее в начале. Строки/кортежи и иные последовательности не использовать. Output:- 4 - 102564 
