Python операторы: от простых операций до перегрузки

Раздел: Основы Python -> Операторы

Основные понятия об операторах в Python

Операторы в Python – это специальные символы или комбинации символов, с помощью которых выполняются действия над данными (операндами). В языке существует несколько групп операторов: арифметические, сравнения, логические, присваивания, битовые, членства и тождественности. Каждая группа решает свой круг задач, а знание их особенностей помогает писать эффективный и понятный код.

Арифметические операторы

Используются для математических вычислений: +, -, *, /, // (целочисленное деление), % (остаток), ** (возведение в степень).


 a = 10
 b = 3
 print(a + b)   # 13
 print(a - b)   # 7
 print(a * b)   # 30
 print(a / b)   # 3.3333333333333335
 print(a // b)  # 3
 print(a % b)   # 1
 print(a ** b)  # 1000
  

значение операторов в python (значение операторов в python)

Типичные ошибки: деление на ноль (ZeroDivisionError); целочисленное деление отрицательных чисел работает по правилам floor, что иногда неожиданно (например, -3 // 2 даёт -2); при смешивании int и float результат становится float, что может привести к потере точности.

Решение: всегда проверять делитель перед делением; для целочисленного деления с математическим округлением вниз использовать floor из модуля math.

Операторы сравнения

Позволяют сравнивать два значения: ==, !=, <, >, <=, >=. Результат – булево значение (True/False).


 x = 5
 y = 10
 print(x == y)  # False
 print(x != y)  # True
 print(x < y)   # True
  

типы операторов python (типы операторов в python)

Ошибка: сравнение чисел с плавающей точкой через == может дать неожиданный результат из-за округления (например, 0.1 + 0.2 == 0.3 – False).

Решение: использовать функцию math.isclose() для сравнения вещественных чисел.

Логические операторы

Объединяют булевы выражения: and, or, not. Работают по принципу короткого замыкания.


 age = 25
 has_license = True
 if age >= 18 and has_license:
     print("Можно водить")
  

определение операторов python (определение операторов в python)

Распространённая проблема: путаница between 'and'/'or' и битовых '&'/'|'. Первые работают с булевыми значениями, вторые – с целыми числами (побитово).

Решение: чётко разделять контекст использования. Для условных выражений применять 'and'/'or', для битовых масок – '&'/'|'.

Операторы присваивания

Базовый = и составные: +=, -=, *=, /=, //=, %=, **=, &=, |= и т.д.


 count = 0
 count += 1   # эквивалентно count = count + 1
 print(count) # 1
  

типы операций в python (типы операций в python)

Ошибка: для неизменяемых типов (int, str) составное присваивание создаёт новый объект, но для изменяемых (list) оно может изменять объект по месту.

Решение: помнить о мутабельности типов; для списков += эквивалентно extend, а не конкатенации с копированием.

Операторы членства и тождественности

in и not in проверяют наличие элемента в последовательности. is и is not проверяют идентичность объектов (одинаковый ли адрес в памяти).


 lst = [1, 2, 3]
 print(2 in lst)   # True
 a = [1, 2]
 b = a
 print(a is b)     # True
  

какие операторы используются в python (какие операторы используются в python?)

Частая путаница: '==' сравнивает значения, а 'is' – идентичность. Для строк и чисел Python иногда кэширует объекты, поэтому 'is' может дать True, но полагаться на это не стоит.

Решение: для сравнения значений всегда использовать '==', для проверки на None – 'is None'.

Как выполнить операцию сложения без знака '+'?

Модуль operator предоставляет функции, эквивалентные стандартным операторам. Это удобно при динамическом выборе операции, например, при передаче функции в качестве аргумента.


 import operator
 result = operator.add(10, 3)
 print(result)  # 13
 # Другие функции: sub, mul, truediv, floordiv, mod, pow, eq, lt и т.д.
  

Проблема: функции не поддерживают составное присваивание (например, operator.iadd). Для этого есть отдельные версии (iadd, isub).

Решение: использовать operator.iadd для изменяемых объектов (например, списков).

Как определить поведение оператора '+' для своего класса?

Перегрузка операторов реализуется через магические методы: __add__, __sub__, __eq__ и т.д.


 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)
 v3 = v1 + v2
 print(v3)  # Vector(4, 6)
  

Распространённая ошибка: не определён метод для обратной операции (например, когда объект другого типа стоит слева от оператора). Для этого есть __radd__, __rsub__ и т.д.

Пример ошибки: 3 + Vector(1,2) вызовет TypeError, если не определён __radd__. Решение: реализовать __radd__ для поддержки сложения с числом слева.

Как записать условие if-else в одну строку?

Тернарный оператор X if условие else Y позволяет компактно выбирать значение.


 x = 10
 result = "четное" if x % 2 == 0 else "нечетное"
 print(result)  # четное
  

Проблема: вложенные тернарные операторы ухудшают читаемость кода. Для сложных условий лучше использовать обычный if-elif-else.

Решение: применять тернарный оператор только для коротких и ясных выражений.

Как применить операцию ко всем элементам списка без цикла?

Списковые включения (list comprehensions) используют любой оператор внутри выражения.


 numbers = [1, 2, 3, 4]
 squares = [n**2 for n in numbers]
 print(squares)  # [1, 4, 9, 16]
  

Ошибка: применение оператора с побочными эффектами (например, изменение внешней переменной) делает код неочевидным.

Решение: для чистых преобразований использовать списковые включения, для сложных операций с состоянием – обычные циклы.

Дополнительные примеры с операторами

Перегрузка всех арифметических операторов для класса Point

Создадим класс Point, поддерживающий сложение, вычитание, умножение на число и обратные операции.

Пример

 class Point:
     def __init__(self, x, y):
         self.x = x
         self.y = y
     def __add__(self, other):
         if isinstance(other, Point):
             return Point(self.x + other.x, self.y + other.y)
         return NotImplemented
     def __radd__(self, other):
         # если other не Point, попробуем сложить как число
         if isinstance(other, (int, float)):
             return Point(self.x + other, self.y + other)
         return NotImplemented
     def __sub__(self, other):
         if isinstance(other, Point):
             return Point(self.x - other.x, self.y - other.y)
         return NotImplemented
     def __mul__(self, scalar):
         if isinstance(scalar, (int, float)):
             return Point(self.x * scalar, self.y * scalar)
         return NotImplemented
     def __rmul__(self, scalar):
         return self.__mul__(scalar)
     def __repr__(self):
         return f"Point({self.x}, {self.y})"

 p1 = Point(1, 2)
 p2 = Point(10, 20)
 print(p1 + p2)      # Point(11, 22)
 print(p1 + 5)       # TypeError (нет __add__ для int), но сработает __radd__ в p1? Нет, сначала Python пробует p1.__add__(5) – возвращает NotImplemented, затем 5.__radd__(p1) – у int нет такого, поэтому TypeError. Чтобы поддержать p1 + 5, нужно определить __add__ для случая other – число. В коде выше __add__ не поддерживает число, только Point. Покажем исправленную версию.
  

Исправленная версия поддержки смешанных типов:

Пример

 class Point:
     def __add__(self, other):
         if isinstance(other, Point):
             return Point(self.x + other.x, self.y + other.y)
         elif isinstance(other, (int, float)):
             return Point(self.x + other, self.y + other)
         return NotImplemented
     def __radd__(self, other):
         return self.__add__(other)

 p = Point(1,2)
 print(p + 3)  # Point(4,5)
 print(3 + p)  # Point(4,5) благодаря __radd__
  
 Point(4,5)
 Point(4,5)
  

Операторы сравнения для пользовательских объектов

Реализуем __eq__ и __lt__ для сравнения точек по расстоянию от начала координат.

Пример

 import math
 class Point:
     def __init__(self, x, y):
         self.x = x
         self.y = y
     def distance(self):
         return math.hypot(self.x, self.y)
     def __eq__(self, other):
         if isinstance(other, Point):
             return self.distance() == other.distance()
         return NotImplemented
     def __lt__(self, other):
         if isinstance(other, Point):
             return self.distance() < other.distance()
         return NotImplemented

 p1 = Point(1,0)
 p2 = Point(0,1)
 print(p1 == p2)  # True (расстояние 1)
 print(p1 < Point(3,0))  # True
  
 True
 True
  

Использование оператора @ для матричного умножения

В Python 3.5+ добавлен оператор @ (__matmul__). Он используется для умножения матриц (например, с библиотекой numpy).

Пример

 import numpy as np
 A = np.array([[1,2],[3,4]])
 B = np.array([[5,6],[7,8]])
 C = A @ B
 print(C)
  
 [[19 22]
  [43 50]]
  

Битовые операторы для работы с флагами

Битовые операторы (&, |, ^, ~, сдвиги <<, >>) удобны для хранения набора флагов в одном целом числе.

Пример

 # Определим флаги как степени двойки
 READ = 1
 WRITE = 2
 EXECUTE = 4

 permissions = READ | EXECUTE  # 5
 print(permissions & READ)   # 1 (True, если установлен)
 print(permissions & WRITE)  # 0 (False)

 # Добавляем WRITE
 permissions |= WRITE
 print(permissions)  # 7

 # Проверяем
 print(bool(permissions & WRITE))  # True
  
 1
 0
 7
 True
  

Оператор in для пользовательских контейнеров

Реализация метода __contains__ позволяет использовать оператор in для своего класса.

Пример

 class Range:
     def __init__(self, start, end):
         self.start = start
         self.end = end
     def __contains__(self, item):
         return self.start <= item <= self.end

 r = Range(10, 20)
 print(15 in r)   # True
 print(25 in r)   # False
  
 True
 False
  

Приоритет операторов и скобки

Порядок вычисления регулируется приоритетом. Скобки меняют его. Пример сложного выражения:

Пример

 result = 2 + 3 * 4 ** 2  # 2 + (3 * (4**2)) = 2 + 48 = 50
 print(result)
 result2 = (2 + 3) * 4 ** 2  # 5 * 16 = 80
 print(result2)
  
 50
 80
  

Приоритет операторов: ** самый высокий, затем унарный минус, умножение/деление, сложение/вычитание, побитовые сдвиги, побитовые AND, XOR, OR, сравнения, присваивание.

Определение операторов в Python - comments

En
определение операторов python (python)