Операторы и выражения: приоритет, преобразования типов🔗
Выражения как инструкции для процессора🔗
Выражение — это комбинация значений и операторов, которую процессор сводит к единому значению. Представьте переменные как именованные ёмкости с данными (flour = 300), а операторы — как действия над ними: + суммирует, * умножает, ** возводит в степень.
Технически выражение состоит из оператора — символа действия — и операндов (чисел, переменных или констант), над которыми он работает.
flour = 300
sugar = 150
total = flour + sugar # Оператор +, операнды: flour (300), sugar (150)
area = 3.14 * radius ** 2 # Операторы *, **
Диаграмма загружается…
Процессор сначала вычисляет всё, что справа от =, сворачивает результат в одно число и только потом записывает его в переменную слева. В итоге в переменной оказывается не формула, а готовое значение.
Арифметика и приоритет операций🔗
Когда вы готовите сложное блюдо, вы не бросаете всё в кастрюлю одновременно. Сначала измельчаете овощи (мелкая работа), потом взвешиваете муку и масло (пропорции), затем смешиваете всё вместе. Процессор выполняет математические выражения точно так же — по строгой иерархии.
В Python доступны семь основных арифметических инструментов:
| Оператор |
Действие |
Пример |
Результат |
Приоритет |
** |
Возведение в степень |
2 ** 3 |
8 |
Высший |
*, / |
Умножение, деление |
10 / 4 |
2.5 |
Средний |
// |
Целочисленное деление |
10 // 4 |
2 |
Средний |
% |
Остаток от деления |
10 % 4 |
2 |
Средний |
+, - |
Сложение, вычитание |
5 + 3 |
8 |
Низший |
Операторы с высшим приоритетом выполняются первыми. Возведение в степень (**) — это ваш нож: сначала нарезаем кубики 2 ** 3, и только потом используем результат в дальнейших расчётах.
Целочисленное деление // и остаток % удобны, когда нужно разделить ресурсы на целые части. Представьте, что вы печёте пироги: у вас есть 17 порций теста, а на один пирог нужно 5 порций. Сколько целых пирогов получится и сколько теста останется?
dough = 17
per_pie = 5
whole_pies = dough // per_pie # 3 целых пирога
leftover = dough % per_pie # 2 порции осталось
print(whole_pies, leftover)
Если стандартное деление / вернуло бы 3.4, то // отсекает дробную часть, оставляя только целое. Оператор % показывает именно «обрезки» — то, что не вошло в целые пироги.
Скобки позволяют нарушить естественный порядок, как когда вы решили сначала смешать сухие ингредиенты, несмотря на рецепт:
result = (2 + 3) * 4 # 20, а не 14
Без скобок процессор сначала умножил бы 3 * 4, потом прибавил 2. Скобки создают подвыражение, которое вычисляется в первую очередь, независимо от приоритета операторов.
Сравнение и логика: получаем ответы да/нет🔗
Чтобы проверить, соответствуют ли данные требованиям, используют операторы сравнения. Они возвращают не число, а логическое значение — True (да) или False (нет).
salt = 5
is_enough = salt >= 5 # Достаточно ли соли?
temp = 95
is_safe = temp <= 100 # Не перегрето?
print(is_enough) # True
print(is_safe) # True
В Python шесть операторов для проверки отношений между значениями:
| Оператор |
Проверка |
Пример |
Результат |
== |
Равенство |
5 == 5 |
True |
!= |
Неравенство |
5 != 3 |
True |
< |
Меньше |
3 < 5 |
True |
> |
Больше |
5 > 3 |
True |
<= |
Меньше или равно |
5 <= 5 |
True |
>= |
Больше или равно |
7 >= 5 |
True |
Часто нужно проверить сразу несколько условий. Для этого служат логические операторы: and возвращает True, только если верны оба выражения, or — когда верно хотя бы одно, а not переворачивает результат на противоположный.
is_hot = True
is_sweet = True
is_dessert = is_hot and is_sweet # True
is_salty = False
is_spicy = True
is_flavorful = is_salty or is_spicy # True
is_ready = not is_hot # False
Вот как работают все комбинации:
| A |
B |
A and B |
A or B |
not A |
| True |
True |
True |
True |
False |
| True |
False |
False |
True |
False |
| False |
True |
False |
True |
True |
| False |
False |
False |
False |
True |
Результат любой проверки — обычное значение, которое можно присвоить переменной. Как на их основе принимать решения в коде — разберём дальше.
Преобразование типов: явное и неявное🔗
Компьютер не терпит неоднозначностей: попытка сложить строку "200" и число 5 приведёт к ошибке — как если бы вы сложили граммы с литрами без перевода единиц. Чтобы выполнить операцию, нужно привести данные к совместимому виду.
Явное преобразование выполняется функциями int(), float(), str() и bool(). Вы явно указываете Python, как интерпретировать значение.
# Для математики: строку → число
flour = "300"
grams = int(flour) # Теперь это целое число 300
total = grams + 200 # Сложение работает
# Для вывода: число → строку
result = "Итого: " + str(total) + " г" # Склеивание текста
Интерпретатор может преобразовать типы и самостоятельно. Неявное преобразование срабатывает при операциях между int и float: целое число автоматически становится дробным, чтобы не потерять точность.
items = 3 # int
price = 4.5 # float
cost = items * price # items стал 3.0, результат 13.5 (float)
Функции преобразования понимают только корректные записи. int("5") сработает, а int("пять") или int("5 кг") вызовут ошибку — интерпретатор читает только цифры, а не человеческий язык.
Составные операторы🔗
Когда вы корректируете количество ингредиента в процессе готовки, записывать flour = flour + 50 утомительно. Python предлагает сокращённую нотацию: +=, -=, *=, /=. Эти операторы обновляют значение в контейнере, не повторяя его имя.
dough_weight = 500
dough_weight += 100 # добавили муки
dough_weight *= 1.1 # увеличили на 10%
Best practice: сложные формулы разбивайте на промежуточные переменные. Это делает код читаемым и упрощает отладку.
# Вместо одной строки
final = (a + b) * c / d
# Лучше так
sum_ab = a + b
scaled = sum_ab * c
final = scaled / d
Теперь, когда мы умеем вычислять и сравнивать значения, возникает вопрос: как заставить программу действовать по-разному в зависимости от результата? Как сказать: если тесто жидкое, добавь муки? Об этом — в следующей лекции про условия.