Основа практически любого языка программирования – это выражения, которые состоят из операндов и операторов. 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. Научиться всем приемам работы с операторами и получить первую работу можно после прохождения курсов:
Тезисно: