📖 Теория: Summary session 3

⚡ Кратко

Урок повторяет три блока: ветвления, математику и модули, хранение чисел. Основные инструменты — if-elif-else, логические операторы, тернарный оператор, match-case, встроенные математические функции, math, Decimal.

  • Условия: if, elif, else; неявное преобразование в bool; цепочные сравнения.
  • Простые ветвления заменяйте тернарным оператором или match-case.
  • Математика: abs, max, min, pow, sum, round; math.sqrt, math.ceil, math.floor.
  • Импорт: import math, from math import sqrt, import math as m.
  • float неточен; для денег используй Decimal('0.1'), передавая строку.

Операторы ветвления

Операторы ветвления позволяют выполнять разные блоки кода в зависимости от условий. В Python используются ключевые слова if, elif и else.

📄 examples/if_elif_else.py
age = 25

if age < 18:
    print("Несовершеннолетний")
elif age < 30:
    print("Молодой взрослый")
elif age < 50:
    print("Взрослый")
else:
    print("Пожилой")
💡 Правило: в цепочке if-elif-else выполняется только первая истинная ветка. Если ни одно условие не истинно, выполняется else (если он есть).

Неявное преобразование в bool

В условиях Python автоматически преобразует значение в bool. Пустые строки, ноль, None, пустые коллекции считаются False; остальное — True.

📄 examples/truthiness.py
name = "Alice"
if name:
    print(f"Привет, {name}!")   # выполнится

value = 0
if value:
    print("Ноль не выведется")  # не выполнится

items = []
if items:
    print("Список непуст")      # не выполнится

Несколько независимых if

Если условия не связаны друг с другом, используйте несколько независимых if. Каждое проверяется отдельно, и несколько веток могут выполниться одновременно.

📄 examples/multiple_if.py
x = 7
if x > 5:
    print("x больше 5")
if x < 10:
    print("x меньше 10")
if x % 2 == 1:
    print("x нечётное")
# Выведет все три строки

Вложенные условия и плоские структуры

Вложенные if позволяют проверять дополнительные условия, но увеличивают отступы и усложняют чтение. Часто их можно заменить комбинацией условий через and/or или guard clauses.

📄 examples/nested_vs_flat.py
# Вложенный вариант
role = "admin"
access = True
if role == "admin":
    if access:
        print("Доступ разрешён")
    else:
        print("Доступ запрещён")
else:
    print("Недостаточно прав")

# Плоский вариант
if role != "admin":
    print("Недостаточно прав")
elif not access:
    print("Доступ запрещён")
else:
    print("Доступ разрешён")

Тернарный оператор

Для простого выбора между двумя значениями используйте тернарный оператор. Он делает код компактнее, но не заменяет сложные ветвления.

📄 examples/ternary.py
age = 20
status = "Совершеннолетний" if age >= 18 else "Несовершеннолетний"
print(status)

# Вложенный тернарный — допустим, но будьте осторожны
score = 85
grade = "Отлично" if score > 90 else "Хорошо" if score > 75 else "Удовлетворительно"
print(grade)

Конструкция match-case

С Python 3.10 доступна конструкция match-case. Она удобна, когда нужно сопоставить одно значение с несколькими шаблонами.

📄 examples/match_case.py
status = 404

match status:
    case 200:
        print("OK")
    case 404:
        print("Not Found")
    case 500:
        print("Internal Server Error")
    case _:
        print("Unknown status")
Проверить по документации: подробнее о match-case читайте в разделе Python Documentation — Structural Pattern Matching.

Встроенные математические функции

Python предоставляет встроенные функции для базовых вычислений. Они доступны без импорта.

📄 examples/builtin_math.py
print(abs(-7))            # 7
print(max(1, 5, 3))       # 5
print(min(2, 8, 4, 1))    # 1
print(pow(2, 3))          # 8
print(sum([1, 2, 3, 4]))  # 10
print(round(4.567, 2))    # 4.57
print(round(2.5))         # 2 (банковское округление)

Банковское округление

Функция round() округляет до ближайшего чётного, если дробная часть равна 0.5. Это стандартное поведение IEEE 754 и не ошибка Python.

📄 examples/bankers_rounding.py
print(round(1.5))   # 2
print(round(2.5))   # 2
print(round(3.5))   # 4
print(round(-1.5))  # -2
print(round(-2.5))  # -2

Модули и импорт

Модуль — это файл .py с кодом. Для использования функций из другого модуля применяется ключевое слово import.

📄 examples/import_styles.py
import math
print(math.sqrt(16))           # 4.0

from math import sqrt, pi
print(sqrt(16), pi)            # 4.0 3.1415...

import math as m
print(m.sqrt(16))              # 4.0

# from math import *           # работает, но не рекомендуется

Модуль math

Модуль math расширяет математические возможности: корни, степень, факториал, округления вверх/вниз, константы и тригонометрия.

📄 examples/math_module.py
import math

print(math.sqrt(25))      # 5.0
print(math.pow(2, 3))     # 8.0
print(math.factorial(5))  # 120
print(math.ceil(4.2))     # 5
print(math.floor(4.9))    # 4
print(math.pi)            # 3.141592653589793
print(math.e)             # 2.718281828459045

Биты, байты и хранение чисел

Бит — это 0 или 1. Байт состоит из 8 бит. Целые числа int в Python имеют произвольную точность, а float занимает 64 бита по стандарту IEEE 754.

📄 examples/binary_storage.py
number = 42
print(bin(number))   # 0b101010

# float — 64 бита: 1 бит знака, 11 бит экспоненты, 52 бита мантиссы
print(0.1 + 0.2)     # 0.30000000000000004

Точность float

Многие десятичные дроби нельзя точно представить в двоичной системе. Поэтому 0.1 + 0.2 даёт не ровно 0.3.

📄 examples/float_comparison.py
import math

a = 0.1 + 0.2
print(a == 0.3)                         # False
print(math.isclose(a, 0.3))             # True
print(round(a, 2) == 0.3)               # True

Decimal для точных расчётов

Для финансовых расчётов используйте Decimal. Важно передавать строку, иначе float уже внесёт погрешность.

📄 examples/decimal_money.py
from decimal import Decimal

print(Decimal('0.1') + Decimal('0.2'))            # 0.3
print(Decimal('0.1') + Decimal('0.2') == Decimal('0.3'))  # True

# Неправильно: float передаёт уже неточное значение
print(Decimal(0.1) + Decimal(0.2))                # 0.30000000000000001665...
Проверить по документации: подробнее о float, math и decimal — в официальной документации Python.