
Основа практически любого языка программирования – это выражения, которые состоят из операндов и операторов. Python имеет операторы на все случаи жизни: для математических вычислений, для сравнений и логических конструкций, для работы с битами и так далее. А если вам не хватает функционала оператора – вы всегда можете написать свой с помощью перегрузки.
Выражения в языках программирования состоят из операторов (что делаем) и операндов (чем оперируем). Например: в выражении «x = 5» x и 5 являются операндами, = – оператором, который присваивает то, что стоит справа от него, тому, что стоит слева от него. В одной строке может содержаться несколько операторов:
x = a / b
, в этом случае операторы выполняются последовательно, согласно приоритету операторов – сначала выполняется «/», затем выполняется «=». О приоритетах поговорим после того, как разберем все операторы.
Небольшая заметка: подавляющее большинство операторов имеют 2 операнда (слева и справа от себя), исключениями являются тернарный оператор (он имеет 3 операнда) и not/битовый not (имеет 1 операнд).
Начнем с самого простого – того, чем вы будете пользоваться с первых минут использования языка:
| Оператор | Форма | Описание | Пример | Результат |
| Присваивание | = | Присваивает значение справа от себя переменной слева от себя | x = 5 | Переменная «x» хранит значение «5» |
| Сложение (конкатенация) | + | Складывает 2 операнда | 4 + 8 | 12 |
| Вычитание | - | Вычитает правый операнд из левого | 4 - 8 | -4 |
| Умножение | * | Умножает 2 операнда | 4 * 8 | 32 |
| Деление | / | Делит левый операнд на правый | 4 / 8 | 0.5 |
| Целочисленное деление | // | Делит левый операнд на правый и отбрасывает дробную часть | 4 // 8 | 0 |
| Модуль | % | Делит левый операнд на правый и отбрасывает целую часть | 4 % 8 | 4 (4/8 = 0 – целая часть, 4 – остаток от деления) |
| Возведение в степень | ** | Возводит левый операнд в степень, равную правому операнду | 4 ** 8 | 65 536 |
Заметка 1: сложение в арифметическом смысле доступно для чисел, но «+» используется шире – для списков, строк и других iterable объектов знак «+» используется как конкатенация, то есть – соединение двух объектов. Если вы создадите 2 списка: list1 = [0,1] и list2 = [2,3], после чего напишете list3 = list1 + list2, то в list3 будет храниться новый список – [0,1,2,3].

Заметка 2: модуль (%) в Python работает не так, как в других языках программирования, когда дело касается отрицательных чисел. Подробности – здесь.
Заметка 3: для всех арифметических и битовых операций существуют шорткаты – +=, -=, *= и так далее. Шорткат объединяет в себе присваивание и арифметический/битовый оператор, он удобен, когда нужно модифицировать значение переменной: x = x + 5 можно записать как x += 5.
Их часто используют вместе, поэтому логично объединить их в одном разделе. И те, и те возвращают True или False по результатам вычисления. Сравнение:
| Оператор | Форма | Описание | Пример | Результат |
| Равенство | == | True, если операнды равны, и False в противном случае | 5 == 5 | True |
| Неравенство | != | True, если операнды не равны, и False в противном случае | 5 != 5 | False |
| Больше | > | True, если левый операнд больше правого, и False в противном случае | 5 > 8 | False |
| Меньше | < | True, если левый операнд меньше правого, и False в противном случае | 5 < 8 | True |
| Больше или равно | >= | True, если операнды равны или левый больше правого, и False в противном случае | 5 >= 5 | True |
| Меньше или равно | <= | True, если операнды равны или левый меньше правого, и False в противном случае | 5 <= 8 | True |
Логические операторы:
| Оператор | Форма | Описание | Пример | Результат |
| И | and | Возвращает True, если оба операнда равны True, и False в противном случае | True and False | False |
| ИЛИ | or | Возвращает True, если хотя бы один из операндов равен True, и False, если оба операнда – False | True or False | True |
| НЕ | not | Возвращает False, если операнд – True, и True, если операнд – False. Унарный оператор – имеет только 1 операнд | not True | False |
Сравнение и логические операторы практически всегда используются при ветвлении, то есть в конструкциях if. Например, если нам нужно понять, входит ли целочисленная переменная в диапазон от 3 до 6, то мы пишем:

if x > 2 and x < 7
Конструкция if-then-else используется часто – настолько часто, что в Python ввели ее упрощенную форму под названием «тернарный оператор». В его основе лежит выражение – оно обычно составляется из логических операторов и операторов сравнения. Форма тернарного оператора:
[если Истина] if [выражение] else [если Ложь]

Проверяют либо вхождение значения в объект, либо тождественность объектов:
| Оператор | Форма | Описание | Пример | Результат |
| «Содержит» | in | Проверяет, содержит ли объект, расположенный справа, элемент, расположенный слева | 2 in [1,2,3] | True |
| «Не содержит» | not in | То же, что in, только с логическим отрицанием | 4 in [1,2,3] | True |
| «Является» | is | Проверяет 2 объекта и возвращает True, если оба имеют одинаковое значение и находятся в одном участке памяти | “sravni” is “sravni” | True (строки с одинаковым содержимым всегда содержатся в одном и том же участке памяти) |
| «Не является» | is not | Проверяет 2 объекта и возвращает False, если оба имеют одинаковое значение и находятся в одном участке памяти | “sravni” is “sravni” | False |
Эти операторы вам, скорее всего, никогда в жизни не пригодятся – они нужны для операций со значениями на уровне бит. И все же:
| Оператор | Форма | Описание | Пример и результат |
| Побитовое И | & | Сравнивает биты двух чисел на одинаковых разрядах, если оба бита – 1, то в результирующее число на тот же разряд ставится 1, если любой бит – 0, то на тот же разряд результата ставится 0 | a = 5 # 0101 b = 3 # 0011 result = a & b # 0001 print(result) # 1 |
| Побитовое ИЛИ | | | Сравнивает биты двух чисел на одинаковых разрядах, если хотя бы один бит – 1, то в результирующее число на тот же разряд ставится 1, если оба бита – 0, то на тот же разряд результата ставится 0 | a = 5 # 0101 b = 3 # 0011 result = a | b # 0111 print(result) # 7 |
| Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ | ^ | Сравнивает биты двух чисел на одинаковых разрядах, если оба бита – 1 или 0, то в результирующее число на тот же разряд ставится 0, если же один из бит равен единице, а второй – нулю, то на тот же разряд результата ставится 1 | a = 5 # 0101 b = 3 # 0011 result = a ^ b # 0110 print(result) # 6 |
| Побитовое НЕ | ~ | Инвертирует биты – 0 становится 1, 1 становится 0. Унарный оператор | a = 5 # 0101 result = ~a # 1010 (в двоичном представлении с учетом знака) print(result) # -6 |
| Сдвиг влево | << | Сдвигает все биты левого операнда влево на количество позиций, равное правому операнду | a = 5 # 0101 result = a << 1 # 1010 print(result) # 10 |
| Сдвиг вправо | >> | Сдвигает все биты левого операнда вправо на количество позиций, равное правому операнду. «Не вместившиеся» биты отбрасываются | a = 5 # 0101 result = a >> 1 # 0010 print(result) # 2 |
Если в выражении встречается несколько операторов, Python выполняет их один за другим, сверяясь с приоритетностью – те, которые выше по приоритету, исполняются первыми. Приоритетность от самой высокой до самой низкой:
Последним выполняется присваивание. Если в коде встречаются шорткаты присваивания – язык раскладывает их в «обычную форму», после чего исполняет операторы отдельно.
Перегрузка операторов – это когда мы для определенных классов и их объектов задаем особое поведение при использовании операторов. Например, у нас есть класс, представляющий вектор, и мы хотим, чтобы этот класс умел пользоваться оператором «+» – то есть чтобы мы могли написать «вектор1 + вектор2» и получить сумму векторов. Кроме того, было бы неплохо определить поведение объекта класса «Вектор» при его передаче в функцию str(). Как это будет выглядеть в коде:
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __str__(self):
return f"Vector({self.x}, {self.y})"
# Пример использования
v1 = Vector(2, 3)
v2 = Vector(4, 5)
v3 = v1 + v2
print(v3) # Вывод: Vector(6, 8)
Детальный разбор перегрузки можно найти в разделе про операторы в официальный документации.
Наконец, операторы можно импортировать как функции – в этом случае вы сможете и пользоваться ими, и переопределять функции при необходимости. Это тоже расписано в документации.
Обычные операторы вы можете изучить самостоятельно, а вот с перегрузкой уже будет сложнее – нужно понимать ООП в Python. Научиться всем приемам работы с операторами и получить первую работу можно после прохождения курсов:
Тезисно: