Таблица операций Python: как выполнять вычисления и сравнения
Основные операторы Python
Наиболее эффективное решение: сводная таблица всех операторов
| Категория | Оператор | Описание | Пример | Результат |
|---|---|---|---|---|
| Арифметические | +, -, *, /, //, %, ** | Сложение, вычитание, умножение, деление, целочисленное деление, остаток, возведение в степень | таблица операций python (таблица операций в python) | 3 |
| Сравнения | ==, !=, <, >, <=, >= | Равно, не равно, меньше, больше, меньше или равно, больше или равно | | True |
| Логические | and, or, not | И, ИЛИ, НЕ | | False |
| Присваивания | =, +=, -=, *=, /=, //=, %=, **=, &=, |=, ^=, <<=, >>= | Простое и составные присваивания | | x = 7 |
| Побитовые | &, |, ^, ~, <<, >> | И, ИЛИ, исключающее ИЛИ, инверсия, сдвиг влево, сдвиг вправо | | 1 |
| Membership | in, not in | Проверка принадлежности | | True |
| Identity | is, is not | Проверка идентичности объектов | | True |
| Тернарный | x if cond else y | Условное выражение | | 'да' |
| Walrus | := | Присваивание внутри выражения | | True |
Как использовать операторы в виде функций?
Модуль operator предоставляет функции, соответствующие операторам: operator.add, operator.eq и т.д. Это удобно для передачи в качестве аргументов.
import operator
print(operator.add(10, 5)) # 15
print(operator.eq(3, 4)) # FalseТипичная ошибка:
Забыть импортировать модуль. Имена функций нужно писать точно (напр. operator.and_ для битового И, так как and зарезервировано).
Как определить собственное поведение операторов для пользовательских объектов?
Переопределите магические методы: __add__, __eq__, __lt__ и т.д.
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 __repr__(self):
return f'Vector({self.x}, {self.y})'
v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2) # Vector(4, 6)Типичная ошибка:
Не возвращать новый объект, а изменять существующий. Для иммутабельности всегда возвращайте новый экземпляр.
Какие дополнительные операторы есть в Python?
Тернарный оператор и оператор walrus.
- Тернарный:
результат = 'положительное' if num > 0 else 'отрицательное' - Walrus: позволяет присвоить значение переменной внутри выражения, например
while (line := file.readline()):
Типичная ошибка:
Путать приоритеты: в тернарном операторе условие вычисляется первым. В walrus обязательно скобки, если нужно использовать результат.
Как писать множественные сравнения компактно?
Python поддерживает цепочки сравнений: a < b < c эквивалентно a < b and b < c.
x = 5
print(1 < x < 10) # TrueТипичная ошибка:
Использование цепочек с разными операторами может привести к неожиданному поведению, например a == b == c проверяет идентичность, а не равенство всех трех.
Как проверить принадлежность и идентичность?
Операторы in и is часто путают. in проверяет наличие элемента, is проверяет, один ли это объект.
a = [1, 2, 3]
b = [1, 2, 3]
print(a is b) # False (разные объекты)
print(a == b) # True (содержимое одинаково)
print(2 in a) # TrueТипичная ошибка:
Использование is вместо == для сравнения чисел или строк. Python кэширует малые объекты, но полагаться на это не стоит.
Расширенные примеры операторов Python
Приоритеты операторов
Приоритет определяет порядок выполнения. Например, арифметические операции имеют высший приоритет над сравнениями.
result = 2 + 3 * 4 # 14, так как умножение выполняется первым
print(result)14
Побитовые операции
Побитовые операторы работают с целыми числами на уровне битов.
a = 0b1100 # 12
b = 0b1010 # 10
print(f"a & b = {a & b} # битовое И: 8 (0b1000)")
print(f"a | b = {a | b} # битовое ИЛИ: 14 (0b1110)")
print(f"a ^ b = {a ^ b} # исключающее ИЛИ: 6 (0b0110)")
print(f"~a = {~a} # инверсия: -13 (дополнение до двух)")
print(f"a << 1 = {a << 1} # сдвиг влево: 24 (0b11000)")
print(f"a >> 2 = {a >> 2} # сдвиг вправо: 3 (0b0011)")a & b = 8 # битовое И: 8 (0b1000) a | b = 14 # битовое ИЛИ: 14 (0b1110) a ^ b = 6 # исключающее ИЛИ: 6 (0b0110) ~a = -13 # инверсия: -13 (дополнение до двух) a << 1 = 24 # сдвиг влево: 24 (0b11000) a >> 2 = 3 # сдвиг вправо: 3 (0b0011)
Логические операторы и короткое замыкание
Логические операторы and и or вычисляются по короткой схеме: если левый операнд определяет результат, правый не вычисляется.
def risky():
print("Вызвана risky")
return True
result = False and risky() # risky не вызывается, результат False
print(result)
result = True or risky() # risky не вызывается, результат True
print(result)False True
Оператор @ для матричного умножения
В Python 3.5+ появился оператор @ для матричного умножения (обычно используется с библиотекой NumPy).
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(A @ B)[[19 22] [43 50]]
Цепочки сравнений с разными операторами
x = 10
print(5 < x == 10) # True, эквивалентно (5 < x) and (x == 10)
print(5 < x != 10) # False, так как x == 10, поэтому x != 10 ложноTrue False
Использование оператора walrus в списковых включениях
data = [1, 4, 9, 16]
# Квадратные корни только тех чисел, которые больше 3
result = [y for x in data if (y := x**0.5) > 3]
print(result)[4.0]