Операции в Python: Полное руководство
Читаемость кода и его выразительность в Python достигается за счет богатого набора операторов и операций, позволяющих компактно и понятно записывать различные действия. В этой статье мы подробно разберем все типы операций в Python: от простых арифметических действий до тонкостей сравнения объектов.
Что такое операторы и операнды?
Оператор — это символ или ключевое слово, которое выполняет определенное действие над одним или несколькими значениями (операндами). Например, в выражении a + b знак + — это оператор сложения, а a и b — операнды.
Операторы в Python делятся на несколько категорий:
-
Арифметические
-
Операторы сравнения
-
Логические
-
Побитовые
-
Операторы присваивания
-
Операторы принадлежности
-
Операторы идентичности
Арифметические операции
Арифметические операторы используются для выполнения математических вычислений. В таблице ниже представлены все арифметические операторы Python:
| Оператор | Название | Пример | Результат |
|---|---|---|---|
| + | Сложение | 5 + 3 | 8 |
| - | Вычитание | 5 - 3 | 2 |
| * | Умножение | 5 * 3 | 15 |
| / | Деление (вещественное) | 5 / 2 | 2.5 |
| // | Целочисленное деление | 5 // 2 | 2 |
| % | Остаток от деления | 5 % 2 | 1 |
| ** | Возведение в степень | 5 ** 2 | 25 |
| - | Унарный минус | -5 | -5 |
| + | Унарный плюс | +5 | 5 |
Важные особенности:
-
Деление
/всегда возвращает число с плавающей точкой (float), даже если результат целочисленный: span style="background-color:#dddddd">4 / 2 даст span style="background-color:#dddddd">2.0 . -
Целочисленное деление
//возвращает результат, округленный вниз до ближайшего целого числа: span style="background-color:#dddddd">7 // 2 даст span style="background-color:#dddddd">3, а span style="background-color:#dddddd">-7 // 2 даст span style="background-color:#dddddd">-4 . -
Остаток от деления span style="background-color:#dddddd">% часто используется для проверки четности числа (span style="background-color:#dddddd">n % 2 == 0) или для работы с циклическими структурами.
-
Возведение в степень span style="background-color:#dddddd">** поддерживает работу с отрицательными степенями: span style="background-color:#dddddd">4 ** 0.5 даст span style="background-color:#dddddd">2.0 (квадратный корень).
Примеры использования:
# Базовые арифметические операции
a, b = 15, 4
print(a + b) # 19
print(a - b) # 11
print(a * b) # 60
print(a / b) # 3.75
print(a // b) # 3
print(a % b) # 3
print(a ** b) # 50625
# Проверка числа на четность
number = 17
if number % 2 == 0:
print(f"{number} - четное")
else:
print(f"{number} - нечетное") # 17 - нечетноеОператоры сравнения (реляционные)
Операторы сравнения используются для сравнения двух значений и всегда возвращают булево значение (True или False)
| Оператор | Название | Пример | Результат |
|---|---|---|---|
| == | Равно | 5 == 3 | False |
| != | Не равно | 5 != 3 | True |
| > | Больше | 5 > 3 | True |
| < | Меньше | 5 < 3 | False |
| >= | Больше или равно | 5 >= 5 | True |
| <= | Меньше или равно | 5 <= 3 | False |
Важно: Операторы сравнения можно объединять в цепочки. Выражение a < b < c эквивалентно (a < b) and (b < c) и работает очень эффективно.
x, y, z = 5, 10, 7
print(x < y < z) # 5 < 10 < 7 -> False
print(x < y > z) # 5 < 10 > 7 -> TrueЛогические операторы
Логические операторы используются для объединения булевых выражений. В Python они записываются словами, что делает код более читаемым:
| Оператор | Название | Пример | Результат |
|---|---|---|---|
| and | Логическое И | True and False | False |
| or | Логическое ИЛИ | True or False | True |
| not | Логическое НЕ | not True | False |
Особенности работы:
-
and возвращает первый "ложный" операнд или последний "истинный", если все операнды истинны.
-
or возвращает первый "истинный" операнд или последний "ложный", если все операнды ложны.
-
В Python следующие значения считаются "ложными" (False): False, None, 0, 0.0, "" (пустая строка), [] (пустой список), {} (пустой словарь), () (пустой кортеж), set() (пустое множество)
# Примеры с логическими операторами
age = 25
has_license = True
if age >= 18 and has_license:
print("Можно водить машину")
# Логические операторы с числами
print(0 and 10) # 0 (первый ложный)
print(5 and 10) # 10 (последний истинный)
print(5 or 10) # 5 (первый истинный)
print(0 or 10) # 10 (последний ложный, но все ложны)
# Условное присваивание с or
name = input("Введите имя: ") or "Гость"
print(f"Привет, {name}") # Если ввод пуст, name будет "Гость"Побитовые операторы
Побитовые операторы работают с числами на уровне их двоичного представления:
| Оператор | Название | Пример | Результат |
|---|---|---|---|
| & | Побитовое И | 5 & 3 | 1 (0101 & 0011 = 0001) |
| | | Побитовое ИЛИ | 5 | 3 | 7 (0101 | 0011 = 0111) |
| ^ | Побитовое исключающее ИЛИ (XOR) | 5 ^ 3 | 6 (0101 ^ 0011 = 0110) |
| ~ | Побитовое НЕ (инверсия) | ~5 | -6 |
| << | Сдвиг влево | 5 << 1 | 10 (0101 << 1 = 1010) |
| >> | Сдвиг вправо | 5 >> 1 | 2 (0101 >> 1 = 0010) |
# Примеры побитовых операций
a, b = 5, 3 # 5 = 0101, 3 = 0011
print(a & b) # 1 (0001)
print(a | b) # 7 (0111)
print(a ^ b) # 6 (0110)
print(~a) # -6 (инверсия всех битов)
print(a << 1) # 10 (умножение на 2)
print(a >> 1) # 2 (деление на 2, целочисленное)Операторы присваивания
Операторы присваивания используются для присвоения значений переменным.
| Оператор | Пример | Эквивалент |
|---|---|---|
| = | x = 5 | x = 5 |
| += | x += 3 | x = x + 3 |
| -= | x -= 3 | x = x - 3 |
| *= | x *= 3 | x = x * 3 |
| /= | x /= 3 | x = x / 3 |
| //= | x //= 3 | x = x // 3 |
| %= | x %= 3 | x = x % 3 |
| **= | x **= 3 | x = x ** 3 |
| &= | x &= 3 | x = x & 3 |
| |= | x |= 3 | x = x | 3 |
| ^= | x ^= 3 | x = x ^ 3 |
| <<= | x <<= 3 | x = x << 3 |
| >>= | x >>= 3 | x = x >> 3 |
x = 10
x += 5 # x = 15
x *= 2 # x = 30
x //= 4 # x = 7
print(x) # 7Операторы принадлежности: in и not in
Операторы in и not in используются для проверки наличия элемента в коллекции (списке, кортеже, строке, множестве, словаре и т.д.)
| Оператор | Назначение | Пример | Результат |
|---|---|---|---|
| in | Проверяет, содержится ли элемент в коллекции | 5 in [1, 2, 3, 4, 5] | True |
| not in | Проверяет, не содержится ли элемент в коллекции | 6 not in [1, 2, 3, 4, 5] | True |
Важные особенности:
-
Для словарей in проверяет наличие ключа, а не значения .
-
Оператор in для строк проверяет вхождение подстроки.
-
Для объектов range проверка выполняется очень эффективно (за O(1))
# Списки и кортежи
fruits = ['яблоко', 'банан', 'апельсин']
print('банан' in fruits) # True
print('груша' not in fruits) # True
# Строки
text = "Hello, World!"
print("World" in text) # True
print("Python" in text) # False
# Словари (проверка ключей)
user = {'name': 'Иван', 'age': 30}
print('name' in user) # True
print('Иван' in user) # False (проверяются ключи!)
# Range
print(50 in range(0, 100)) # True (очень быстро!)Операторы идентичности: is и is not
Это, пожалуй, один из самых важных и часто вызывающих вопросы разделов. Операторы is и is not сравнивают идентичность объектов, а не их значения.
| Оператор | Назначение | Пример |
|---|---|---|
| is | Проверяет, являются ли два объекта одним и тем же объектом (ссылаются ли на один участок памяти) | a is b |
| is not | Проверяет, не являются ли два объекта одним и тем же объектом | a is not b |
Чем отличается == от is?
Это ключевое различие, которое нужно понимать каждому Python-разработчику:
-
== (оператор равенства) — сравнивает значения объектов. Выражение a == b проверяет, эквивалентны ли данные в переменных a и b. Для пользовательских классов поведение == можно переопределить с помощью метода __eq__().
-
is (оператор идентичности) — сравнивает идентификаторы объектов, то есть проверяет, указывают ли переменные на один и тот же объект в памяти. Это эквивалентно сравнению id(a) == id(b).
# Пример 1: Разные объекты с одинаковыми значениями
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True (значения одинаковы)
print(a is b) # False (это разные объекты в памяти)
# Пример 2: Один и тот же объект
c = a
print(a is c) # True (ссылаются на один объект)
# Пример 3: Проверка на None (рекомендуемый способ)
x = None
print(x is None) # True
print(x == None) # True, но так делать не рекомендуется
# Пример 4: Строки могут вести себя неожиданно из-за интернирования
s1 = "hello"
s2 = "hello"
print(s1 is s2) # Может быть True из-за оптимизации, но полагаться на это нельзя!Практические рекомендации:
-
Используйте is для сравнения с None, True, False (это синглтоны).
-
Используйте == для сравнения значений чисел, строк, списков и других коллекций.
-
Используйте is когда вам действительно нужно проверить, что две переменные ссылаются на один объект.
Оператор := (моржовый оператор / walrus operator)
Оператор := был представлен в Python 3.8 и получил название "walrus operator" (моржовый оператор) за сходство с моржом — глазами и клыками .
Его официальное название — оператор присваивания в выражении (assignment expression). Он позволяет присвоить значение переменной прямо внутри другого выражения, например, в условии if или цикле while.
# Без оператора := (традиционный подход)
data = input("Введите данные: ")
while len(data) > 0:
print(f"Вы ввели: {data}")
data = input("Введите данные: ")
# С оператором := (более компактно)
while (data := input("Введите данные: ")) != "":
print(f"Вы ввели: {data}")Ключевые особенности:
-
Позволяет избежать повторного вычисления выражений.
-
Повышает читаемость кода, когда нужно и присвоить, и проверить значение.
-
Имеет низкий приоритет, поэтому в сложных выражениях рекомендуется использовать скобки
Другие примеры использования:
# В списковых включениях (list comprehensions)
numbers = [1, 5, 8, 12, 15, 3]
# Вычисляем квадрат и фильтруем те, что больше 10
squared = [n_sq for n in numbers if (n_sq := n ** 2) > 10]
print(squared) # [25, 64, 144, 225]
# Проверка и обработка данных из файла
with open('data.txt', 'r') as file:
while (line := file.readline().strip()):
print(f"Обработка: {line}")
# Условное выполнение с сохранением результата
if (result := some_expensive_calculation()) > 100:
print(f"Результат превысил 100: {result}")Когда НЕ стоит использовать:
Оператор := может ухудшить читаемость кода, если использовать его в слишком сложных выражениях или вкладывать один в другой:
# Плохой пример - трудно читать
values = [5, 15, 25, 35, 45]
if (above := (v := values[0]) > 10) and (incremented := (new := v + 10) > 20):
print(new) # Не делайте так!Тернарный условный оператор
Тернарный оператор позволяет записать условное выражение в одну строку.
Его синтаксис: значение_если_истина if условие else значение_если_ложь.
age = 18
status = "Совершеннолетний" if age >= 18 else "Несовершеннолетний"
print(status) # "Совершеннолетний"
# Вложенный тернарный оператор
score = 85
grade = "A" if score >= 90 else "B" if score >= 80 else "C" if score >= 70 else "D"
print(grade) # "B"Приоритет операторов
В Python, как и в математике, у операторов есть приоритет. Операторы с более высоким приоритетом выполняются раньше. Ниже приведена таблица приоритетов от высшего к низшему:
| Приоритет | Операторы | Описание |
|---|---|---|
| 1 (высший) | (...) | Скобки |
| 2 | ** | Возведение в степень |
| 3 | +x, -x, ~x | Унарные операторы |
| 4 | *, /, //, % | Умножение, деление, остаток |
| 5 | +, - | Сложение, вычитание |
| 6 | <<, >> | Побитовые сдвиги |
| 7 | & | Побитовое И |
| 8 | ^ | Побитовое XOR |
| 9 | | | Побитовое ИЛИ |
| 10 | ==, !=, >, <, >=, <=, is, is not, in, not in | Сравнения, идентичность, принадлежность |
| 11 | not | Логическое НЕ |
| 12 | and | Логическое И |
| 13 (низший) | or | Логическое ИЛИ |
Рекомендация: Используйте скобки для явного указания порядка вычислений, особенно в сложных выражениях. Это улучшает читаемость кода.
Сводная таблица всех операторов Python
| Категория | Оператор | Что делает |
|---|---|---|
| Арифметические | + | Сложение |
| - | Вычитание | |
| * | Умножение | |
| / | Вещественное деление | |
| // | Целочисленное деление | |
| % | Остаток от деления | |
| ** | Возведение в степень | |
| Сравнения | == | Равно (по значению) |
| != | Не равно | |
| > | Больше | |
| < | Меньше | |
| >= | Больше или равно | |
| <= | Меньше или равно | |
| Логические | and | Логическое И |
| or | Логическое ИЛИ | |
| not | Логическое НЕ | |
| Побитовые | & | Побитовое И |
| | | Побитовое ИЛИ | |
| ^ | Побитовое исключающее ИЛИ (XOR) | |
| ~ | Побитовое НЕ (инверсия) | |
| << | Побитовый сдвиг влево | |
| >> | Побитовый сдвиг вправо | |
| Присваивания | = | Простое присваивание |
| +=, -=, *=, /= и др. | Составные присваивания | |
| := | Присваивание в выражении (Python 3.8+) | |
| Принадлежности | in | Проверка наличия элемента в коллекции |
| not in | Проверка отсутствия элемента в коллекции | |
| Идентичности | is | Проверка на идентичность объектов |
| is not | Проверка на неидентичность объектов |
Заключение
Python предлагает богатый набор операторов, которые делают код выразительным и лаконичным. Понимание различий между == и is, правильное использование оператора := и знание приоритетов помогут вам писать более качественный и эффективный код.
Освоение операторов — это фундамент, на котором строится все дальнейшее изучение языка. Практикуйтесь, экспериментируйте с разными типами данных, и вскоре использование этих операторов станет для вас естественным.