Операторы ветвления
Операторы ветвления позволяют выполнять разные блоки кода в зависимости от условий. В Python используются ключевые слова if, elif и else.
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.
name = "Alice"
if name:
print(f"Привет, {name}!") # выполнится
value = 0
if value:
print("Ноль не выведется") # не выполнится
items = []
if items:
print("Список непуст") # не выполнится
Несколько независимых if
Если условия не связаны друг с другом, используйте несколько независимых if. Каждое проверяется отдельно, и несколько веток могут выполниться одновременно.
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.
# Вложенный вариант
role = "admin"
access = True
if role == "admin":
if access:
print("Доступ разрешён")
else:
print("Доступ запрещён")
else:
print("Недостаточно прав")
# Плоский вариант
if role != "admin":
print("Недостаточно прав")
elif not access:
print("Доступ запрещён")
else:
print("Доступ разрешён")
Тернарный оператор
Для простого выбора между двумя значениями используйте тернарный оператор. Он делает код компактнее, но не заменяет сложные ветвления.
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. Она удобна, когда нужно сопоставить одно значение с несколькими шаблонами.
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 предоставляет встроенные функции для базовых вычислений. Они доступны без импорта.
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.
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.
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 расширяет математические возможности: корни, степень, факториал, округления вверх/вниз, константы и тригонометрия.
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.
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.
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 уже внесёт погрешность.
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.