Логические выражения, условные операторы и цикл
Долги за прошлый раз: кеш, треш и изоляция
Связывание и refcount:
- Как кешируются объекты? (а нужно ли это знать)
- но
- проблема изолированных пространств имён
1 >>> a = [1, 2, "QQ"]; b = [a, 4]; a[1] = b 2 >>> a 3 [1, [[...], 4], 'QQ'] 4 >>> b 5 [[1, [...], 'QQ'], 4] 6 >>> a[1] is b 7 True 8 >>> b[0] is a 9 True 10 >>> c = a, b 11 >>> sys.getrefcount(a) 12 4 13 >>> sys.getrefcount(c[0]) 14 4 15 >>> del a, b 16 >>> sys.getrefcount(c[0]) 17 3 18 >>> sys.getrefcount(c[1]) 19 3 20 >>> del c
Нечто про gc
Как посмотреть все ссылки на объект: gc.get_referrers()
Алгебра логики
Операции сравнения, тип 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:
Цикл while
- Каноническая схема цикла:
- например
break, continue
Клауза else — не выполняется, если выход из цикла был по break:
Нечто про моржа
Операция (а не выделенный оператор) связывания: «:=», см pep-0572
- основное применение (здравствуй, Си!):
- Но не только!
(не успеем!) Нечто про математику
import math vs. from math import *
вычисления в рациональных числах с помощью decimal и fractions
decimal.Decimal(1.1) vs. decimal.Decimal("1.1")
fractions.Fraction(1/3) vs. fractions.Fraction(1,3)
Коротко про ввод и вывод в Д/З
ptint()
input()
int(input())
eval(input()), что такое eval() и как работает
Д/З
Более подробные формулировки задач и интерфейс для их сдачи доступны по ссылкам. В формулировках имеются советы и подсказки-спойлеры (доступны, если нажать «показать комментарии»). Пользоваться последовательностями Python (кроме преобразования ввода и множественного связывания) в этих задачах нельзя.
Ограничения Pytnon3.7
На факультетском EJudge используется Python3.7, в нём не работает конструкция «:=», увы!
Прочитать и прощёлкать учебник (до функций)
EJudge: SquareEquation 'Квадратное уравнение'
Ввести через запятую три числа: a, b и c, вывести все вещественные решения уравнения $$ax^2+bx+c=0$$. При $$a\ne 0$$ это уравнение превращается в квадратное. Решения выводить через пробел в порядке возрастания, если решений нет, вывести 0, если их бесконечно много — -1.
1,-3,2
1.0 2.0
EJudge: SecondMax 'Почти победа'
Ввести по одному в строке целые числа, не равные нулю (не менее одного, конец ввода — 0), вывести второй максимум последовательности (число, строго меньшее максимума последовательности, и не меньшее остальных чисел в ней), и NO, если такового нет.
1 2 3 4 3 2 1 0
3
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: MaxSubsum 'Полоса удач'
Ввести в столбик последовательность целых (положительных и отрицательных) чисел, не равных нулю; в конце этой последовательности стоит 0. Вывести наибольшую сумму последовательно идущих элементов этой последовательности (не менее одного).
2 3 -7 -1 3 4 5 -2 -4 7 8 -6 -1 0
21