Различия между версиями 1 и 2
Версия 1 от 2022-09-25 00:32:01
Размер: 5933
Редактор: FrBrGeorge
Комментарий:
Версия 2 от 2022-09-25 01:29:49
Размер: 11073
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 35: Строка 35:
 {{{#!highlight Python  {{{#!highlight py3
Строка 55: Строка 55:
== Сравнения и тип данных bool ==
 
Многие объекты можно сравнивать. Например, числа:
{{{#!highlight pycon
>>> 4 < 5
True
>>> a, b = 123, 456 // 3
>>> a >= b
False
>>> a + 25 == b - 4
True
>>> a != b
True
}}}

В действительности `True` и `False` — это такие объекты (как и ''всё'' в python, зачем плодить лишние сущности?), типа `bool`
 * Операции сравнения — ''такие же'', как `+` или `*`, только более низкоприоритетные: сначала вычисляются арифметические выражения, затем сравнения (опять обходимся без лишних сущностей!)
 * Выражения со сравнениями ничем не отличаются от других выражений: результат их вычисления — объект python (обычно типа `bool`, разве что в этом разница)
 * Результаты сравнения можно связывать именами:
 {{{#!highlight pycon
>>> res = a < b
>>> res
True
>>> print(res)
True
>>> type(res)
<class 'bool'>
>>> type(False)
<class 'bool'>
}}}


== Условный оператор (простая форма) ==
 * Просто условный оператор:
 {{{#!python
if условие:
    оператор-1
    оператор-2
    …
 }}}
 * Понятие блока с отступом
 * Клауза `else`
 {{{#!python
if условие:
    операторы для True
    …
else:
    операторы для False
    …
}}}
Пример про `a>b` vs `a⩽b`

'''TODO''' Ещё примеры.

=== Вложенные условные операторы ===
Внутри блока с отступом могут встречаться условные операторы:
{{{#!python
#!/usr/bin/env python3
a = int(input())
b = int(input())
if b != 0:
    if a / b > 10:
        print(a, "раз в десять больше", b)
    else:
        print(a, "не сильно больше или даже меньше", b)
else:
    if a > b:
        print(a, "бесконечно больше", b)
        print("потому что любое положительное число бесконечно больше нуля")
    else:
        if a < b:
            print(a, "бесконечно меньше", b)
            print("потому что любое отрицательное число бесконечно меньше нуля")
        else:
            print(a, "и", b, "— нули")
}}}
 * Альтернативные условия: проблема «ступенек» на приведённом примере `>` / `<` или `==`
  * Вариант с `elif:`:
  {{{#!highlight py3

else:
    if a > b:
        print(a, "бесконечно больше", b)
        print("потому что любое положительное число бесконечно больше нуля")
    elif a < b:
        print(a, "бесконечно меньше", b)
        print("потому что любое отрицательное число бесконечно меньше нуля")
    else:
        print(a, "и", b, "— нули")
  }}}
 * Общий вид оператора `if:` с альтернативными условиями:
 {{{#!python
if условие-0:
    операторы для условия-0
elif условие-1:
    операторы для условия-1

elif условие-N:
    операторы для условия-N

else:
    операторы для ситуации, когда ни одно условие не выполнено
 }}}
   * Порядок вычисления альтернативных условий

== Д/З ==
 * Самую малость пощёлкать [[https://pythontutor.ru/lessons/ifelse/|Второе занятие учебника]]
  * Если вы умеете в алгебру логики — дощёлкать до конца!
  * Если не умеете — не беда, на следующем занятии научимся
 * Решить первые 7 задач из второго занятия — до «Ход ладьи» ''включительно''
  * Если вы не умеет в алгебру логики — придётся использовать вложенные `if`-ы и кое-где повторять один и тот же `print()`
 * Прислать семь файлов с рпешениями ''в виде семи приложений к одному письму'' по адресу <<MailTo(uneexlectures AT cs DOT msu DOT ru)>>
  * Имена файлов: от `prog_2_1.py` до `prog_2_7.py`
  * В поле Subject '''должно быть''' «слово» !PhilosoPython2022 (другие слова тоже можно ☺)

Прямое построение алгоритма, сравнение и ветвления

Превращение «формулы» в алгоритм

На этом этапе речь идёт о задачах, в которых не нужно повторять действия.

  1. Определиться с постановкой задачи. Что дано, что требуется найти, каковы дополнительные требования?
  2. Решить задачу вручную (это можно сделать за адекватное число шагов)
    • Разложить решение на отдельные действия с какими-либо объектами

  3. Записать действия на наиболее знакомом вам языке

    • Скорее всего — по-русски!
    • Не записывать можно только при условии, что вы способны наизусть повторить эти действия слово-в-слово

  4. Подумать над моделированием данных реального мира с помощью типов данных Python

    • Что нужно ввести, что нужно вывести?
    • Какие промежуточные данные потребуется вычислить?
  5. Превратить придуманные вами действия в последовательность порождения и преобразования данных

    • Какое действие за каким следует
  6. Попытаться однозначно перевести каждое действие на Python

    • Обратите внимание на то, что лишних слов в формулировке не бывает!

    • Про каждое слово в вашей формулировке задайте себе вопрос «а что оно значит» — наверняка вам придётся отражать это в программе

На примере задачи с электронными часами

Дано число n. С начала суток прошло n минут. Определите, сколько часов и минут будут показывать электронные часы в этот момент. Программа должна вывести два числа: количество часов (от 0 до 23) и количество минут (от 0 до 59). Учтите, что число n может быть больше, чем количество минут в сутках.

  1. Дано произвольное натуральное число — количество минут, прошедших с полуночи некоторого дня. Возможно, это было не сегодня, а один или несколько дней назад. Нужно узнать, который час и сколько минут показывают часы. Формат часов — 24-часовой.
  2. Отбрасываем из n все полные дни. Остаются минуты, прошедшие за сегодня. Считаем в них количество полных часов, а остаток — минуты.

  3. Действия:
    • Количество минут за сегодня — остаток от деления n на количество минут в сутках

    • Количество часов за сегодня — целая часть от деления количества минут за сегодня на 60, а минуты — остаток от деления того же числа на 60
  4. Все числа целые, надо использовать целочисленное деление. Нам понадобится промежуточное значение — количество минут за сегодня, назовём его t

  5. Решение на русском (более формализованные действия):
    • Вводим n

    • t — остаток от деления n на 60 * 24 (минут в сутках)

    • h часов — целая часть от деления t на 60

    • m минут — остаток от деления t на 60

    • Выводим через пробел n и m

  6. Решение на Python:
       1 n = int(input())      # Вводим `n`
       2 t = n % (60 * 24)     # `t` — остаток от деления `n` на `60 * 24` (минут в сутках)
       3 h = t // 60           # `h` часов — целая часть от деления `t` на `60`
       4 m = t % 60            # `m` минут — остаток от деления `t` на `60`
       5 print(h, m)           # Выводим через пробел `n` и `m`
    

Замечания:

⇒ 1

Не бывает «единственно правильного решения»: критерий правильности не в самой программе, а в том, что на всех входных данных она должна давать правильный ответ

  • Например, вот это тоже решение:
       1 t = int(input())%1440
       2 print(t // 60, t % 60)
    
  • И это тоже ☺ (не пытайтесь разобраться, это может быть вредно для здоровья☺):
       1 (lambda t: print(t // 60, t % 60))(int(input())%1440)
    
⇒ 2

Среди всех правильных решений предпочтительно то, которое легче понять!

Сравнения и тип данных bool

Многие объекты можно сравнивать. Например, числа:

   1 >>> 4 < 5
   2 True
   3 >>> a, b = 123, 456 // 3
   4 >>> a >= b
   5 False
   6 >>> a + 25 == b - 4
   7 True
   8 >>> a != b
   9 True
  10 

В действительности True и False — это такие объекты (как и всё в python, зачем плодить лишние сущности?), типа bool

  • Операции сравнения — такие же, как + или *, только более низкоприоритетные: сначала вычисляются арифметические выражения, затем сравнения (опять обходимся без лишних сущностей!)

  • Выражения со сравнениями ничем не отличаются от других выражений: результат их вычисления — объект python (обычно типа bool, разве что в этом разница)

  • Результаты сравнения можно связывать именами:
       1 >>> res = a < b
       2 >>> res
       3 True
       4 >>> print(res)
       5 True
       6 >>> type(res)
       7 <class 'bool'>
       8 >>> type(False)
       9 <class 'bool'>
      10 
    

Условный оператор (простая форма)

  • Просто условный оператор:
       1 if условие:
       2     оператор-1
       3     оператор-2
       4 
    
  • Понятие блока с отступом
  • Клауза else

       1 if условие:
       2     операторы для True
       3 
       4 else:
       5     операторы для False
       6 
    

Пример про a>b vs a⩽b

TODO Ещё примеры.

Вложенные условные операторы

Внутри блока с отступом могут встречаться условные операторы:

   1 #!/usr/bin/env python3
   2 a = int(input())
   3 b = int(input())
   4 if b != 0:
   5     if a / b > 10:
   6         print(a, "раз в десять больше", b)
   7     else:
   8         print(a, "не сильно больше или даже меньше", b)
   9 else:
  10     if a > b:
  11         print(a, "бесконечно больше", b)
  12         print("потому что любое положительное число бесконечно больше нуля")
  13     else:
  14         if a < b:
  15             print(a, "бесконечно меньше", b)
  16             print("потому что любое отрицательное число бесконечно меньше нуля")
  17         else:
  18             print(a, "и", b, "— нули")
  • Альтернативные условия: проблема «ступенек» на приведённом примере > / < или ==

    • Вариант с elif::

         1 
         2 else:
         3     if a > b:
         4         print(a, "бесконечно больше", b)
         5         print("потому что любое положительное число бесконечно больше нуля")
         6     elif a < b:
         7         print(a, "бесконечно меньше", b)
         8         print("потому что любое отрицательное число бесконечно меньше нуля")
         9     else:
        10         print(a, "и", b, "— нули")
      
  • Общий вид оператора if: с альтернативными условиями:

       1 if условие-0:
       2     операторы для условия-0
       3 elif условие-1:
       4     операторы для условия-1
       5 
       6 elif условие-N:
       7     операторы для условия-N
       8 
       9 else:
      10     операторы для ситуации, когда ни одно условие не выполнено
    
    • Порядок вычисления альтернативных условий

Д/З

  • Самую малость пощёлкать Второе занятие учебника

    • Если вы умеете в алгебру логики — дощёлкать до конца!
    • Если не умеете — не беда, на следующем занятии научимся
  • Решить первые 7 задач из второго занятия — до «Ход ладьи» включительно

    • Если вы не умеет в алгебру логики — придётся использовать вложенные if-ы и кое-где повторять один и тот же print()

  • Прислать семь файлов с рпешениями в виде семи приложений к одному письму по адресу <uneexlectures AT cs DOT msu DOT ru>

    • Имена файлов: от prog_2_1.py до prog_2_7.py

    • В поле Subject должно быть «слово» PhilosoPython2022 (другие слова тоже можно ☺)

Python/PhilosoPython2022/03_ComparisonsIf (последним исправлял пользователь FrBrGeorge 2022-09-25 01:29:49)