Различия между версиями 10 и 11
Версия 10 от 2020-09-16 12:46:07
Размер: 9846
Редактор: FrBrGeorge
Комментарий:
Версия 11 от 2020-09-16 12:46:36
Размер: 9845
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 248: Строка 248:
 1. <<EJCMC, 148, SquareEquation, Квадратное уравнение)>>  1. <<EJCMC(148, SquareEquation, Квадратное уравнение)>>

Логические выражения, условные операторы и цикл

Долги за прошлый раз: кеш, треш и изоляция

Связывание и refcount:

  • Как кешируются объекты? (а нужно ли это знать)
       1 >>> a, b = 1092, 1092; c = 1092
       2 >>> a is b is c
       3 True
       4 >>> a, b = 1092, 1092
       5 >>> c = 1092
       6 >>> a is b, a is c
       7 (True, False)
    
    • но
       1 >>> a, b = 92, 92
       2 >>> c = 92
       3 >>> a is b is c
       4 True
    
  • проблема изолированных пространств имён
       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

       1 >>> import gc
       2 >>> gc.disable()
       3 >>> gc.set_debug(gc.DEBUG_LEAK)
       4 >>> a = [1,.2,3]; a[1] = a
       5 >>> a
       6 [1, [...], 3]
       7 >>> hex(id(a))
       8 '0x7f699e930800'
       9 >>> del a
      10 >>> gc.collect()
      11 gc: collectable <list 0x7f699e930800>
      12 1
      13 >>> gc.garbage
      14 [[1, [...], 3]]
    
  • Как посмотреть все ссылки на объект: gc.get_referrers()

  • что такое dir() и globals() (а также locals())

Алгебра логики

  • Операции сравнения, тип 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

Сравнения

  • Простые: == , <, !=, >= и т. п.

  • is , in

       1 >>> a = b = 1,2,3,4
       2 >>> c = 1,2,3,4
       3 >>> a is c
       4 False
       5 >>> a == c
       6 True
       7 >>> a is b
       8 True
       9 >>> a == b
      10 True
    
  • Многоместные
       1 >>> a,b,c,d = 1,2,3,4
       2 >>> a<b<c<d
       3 True
       4 >>> a,b,c,d = 1,2,30,4
       5 >>> a<b<c<d
       6 False
       7 >>> a,b,c,d = 1,2,3,4
       8 >>> (a<b) and (b<c) and (c<d)
       9 True
      10 >>> a<b<c<d
      11 True
      12 >>> a, b, c, d = 3,2,4,1
      13 >>> a, b, c, d = 3, 2, 4, 1
      14 >>> a > b <= c >= d
      15 True
      16 >>> a > b <= c != d
      17 True
    
  • Таким образом,
       1 >>> False is False
       2 True
       3 >>> True in [False]
       4 False
       5 >>> False is False in [False]
       6 True
    
    • wait шhат?

Условные действия

  • Конструкция a and b or c как замена тернарной операции a ? b : c в Си

    • Не работает, как ожидается, если b пусто

  • Условная операция выражение-True if выражение-условие else выражение-false

       1 >>> for a,b,c in (1,2,3), (0,2,3), (1,0,3):
       2 ...     print(a and b or c, b if a else c)
       3 ...
       4 2 2
       5 3 3
       6 3 0
    
  • Блоки
    • Условный оператор:
      оператор
      if выражение:
          оператор
          оператор
          оператор
      оператор
      • Выражение: непустое (True) или пустое (False)
      • Отступы в блоке одинаковые (иначе ошибка)

  • Условный оператор (общий вид):
       1 if условие:
       2     тело-true
       3 elif условие-1:
       4     тело-true-1
       5 elif условие-2:
       6     тело-true-2
       7 
       8 elif условие-N:
       9     тело-true-N
      10 else:
      11     тело-false
    
    • Если бы не было elif:

       1 if условие:
       2     тело-true
       3 else:
       4     if условие-1:
       5         тело-true-1
       6     else:
       7         if условие-2:
       8         тело-true-2
       9 
      10             else:
      11                 if условие-N:
      12                     тело-true-N
      13                 else:
      14                     тело-false
    

Цикл while

  • Каноническая схема цикла:
       1 инициализация
       2 while условие:
       3     тело
       4     изменение условий
    
    • например
    •    1   i = 0
         2   while i < 10:
         3       print(i)
         4       i += 1
      
  • break, continue

  • Клауза else — не выполняется, если выход из цикла был по break:

       1 i = 0
       2 while i < 2:
       3     j = 34+i
       4     print("Starting from", j)
       5     while j < 66:
       6         print(j)
       7         if j==42:
       8             print("Found 42")
       9             break
      10         j += 4
      11     else:
      12         print("42 not found")
      13     i += 1
    

Нечто про моржа

Операция (а не выделенный оператор) связывания: «:=», см pep-0572

  • основное применение (здравствуй, Си!):
       1 while chunk := fp.read(200):
       2    print(chunk)
    
  • Но не только!
  • отличия от оператора связывания

  • примеры

(не успеем!) Нечто про математику

  • 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)

  • Про функцию atan2() — см. Atan2

Коротко про ввод и вывод в Д/З

  • ptint()

  • input()

  • int(input())

  • eval(input()), что такое eval() и как работает

Д/З

Более подробные формулировки задач и интерфейс для их сдачи доступны по ссылкам. В формулировках имеются советы и подсказки-спойлеры (доступны, если нажать «показать комментарии»). Пользоваться последовательностями Python (кроме преобразования ввода и множественного связывания) в этих задачах нельзя.

  1. Прочитать и прощёлкать учебник (до функций)

TODO: тесты для задач пока не оформлены, в TG будет отдельное сообщение, когда закончу (срок сдачи подвину соответственно) -- FrBrGeorge 2020-09-15 12:45:59

  1. EJudge: SquareEquation 'Квадратное уравнение'

    Ввести через запятую три числа: a, b и c, вывести все вещественные решения уравнения $$ax^2+bx+c=0$$. При $$a\ne 0$$ это уравнение превращается в квадратное. Решения выводить через пробел в порядке возрастания, если решений нет, вывести 0, если их бесконечно много — -1.

    Input:

    1,-3,2
    Output:

    1.0 2.0
    • Ввести три числа: a, b и c, вывести решение уравнения $$ax^2+bx+c=0$$. При $$a\ne 0$$ это уравнение превращается в квадратное. Если решений нет, вывести NO, если их бесконечно много — INF.

  2. EJudge: SecondMax 'Почти победа'

    Ввести по одному в строке целые числа, не равные нулю (не менее одного, конец ввода — 0), вывести второй максимум последовательности (число, строго меньшее максимума последовательности, и не меньшее остальных чисел в ней), и NO, если такового нет.

    Input:

    1
    2
    3
    4
    3
    2
    1
    0
    Output:

    3
    • Ввести по одному в строке целые числа (не мене одного, конец ввода — 0), вывести второй максимум последовательности (число, строго меньшее максимума последовательности, и не меньшее остальных чисел в ней), и NO, если такового нет.

  3. EJudge: DotBox 'Ящик с точками'

    Вводить вещественные числа x, y и z по три в строке через запятую, считая их координатами точек (не менее одной тройки). Конец ввода — пустая строка. Вывести минимальный объём параллелепипеда со сторонами, параллельными осям координат, содержащего все точки.

    Input:

    3,2,1
    -1.5, -1.5, -1.5
    1,-1.3,1
    0,0.5,0
    1,2,3
    
    Output:

    70.875
    • Вводить вещественные числа x, y и z по три в строке через запятую, считая их координатами точек. Конец ввода — пустая строка. Вывести минимальный объём параллелепипеда со сторонами, параллельными осям координат, содержащего все точки.

  4. EJudge: MaxSubsum 'Полоса удач'

    Ввести в столбик последовательность целых (положительных и отрицательных) чисел, не равных нулю; в конце этой последовательности стоит 0. Вывести наибольшую сумму последовательно идущих элементов этой последовательности (не менее одного).

    Input:

    2
    3
    -7
    -1
    3
    4
    5
    -2
    -4
    7
    8
    -6
    -1
    0
    Output:

    21

LecturesCMC/PythonIntro2020/02_Conditionals (последним исправлял пользователь FrBrGeorge 2020-09-16 15:14:56)