Операторы в 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)
Как использовать операторы через функции модуля operator?
Модуль operator предоставляет функции, соответствующие операторам. Это удобно для передачи операций как аргументов.
import operator
print(operator.add(10, 5)) # 15
print(operator.floordiv(10, 3)) # 3
print(operator.pow(2, 3)) # 8типы операторов python (типы операторов в python)
Проблемы: при делении на ноль возникает ZeroDivisionError. Рекомендуется проверять делитель или обрабатывать исключение.
try:
result = 10 / 0
except ZeroDivisionError:
print("Деление на ноль невозможно")определение операторов python (определение операторов в python)
Как сравнивать значения?
Операторы сравнения: == (равно), != (не равно), >, <, >=, <=. Результат всегда bool.
x = 5
y = 10
print(x == y) # False
print(x != y) # True
print(x < y) # True
print(x >= 5) # Trueтипы операций в python (типы операций в python)
Как использовать цепочки сравнений?
Python позволяет объединять несколько сравнений в одно выражение. Например, проверка, находится ли число в интервале.
a = 7
print(5 < a < 10) # True (равносильно 5 < a and a < 10)
print(0 < a <= 5) # Falseкакие операторы используются в python (какие операторы используются в python?)
Ошибки: сравнение float может давать неожиданные результаты из-за погрешностей. Лучше использовать math.isclose.
import math
print(0.1 + 0.2 == 0.3) # False
print(math.isclose(0.1 + 0.2, 0.3)) # True
Как объединять логические условия?
Логические операторы: and, or, not. Они работают по принципу короткого замыкания.
a = True
b = False
print(a and b) # False
print(a or b) # True
print(not a) # False
Как использовать логические операторы с небулевыми значениями?
Операторы and и or возвращают не обязательно bool, а один из операндов.
print(0 and 42) # 0
print("" or "default") # "default"
print(None or 100) # 100
Путаница с приоритетом: not имеет более высокий приоритет, чем and, or. Рекомендуется использовать скобки.
print(not True and False) # False (not True -> False, then False and False -> False)
print(not (True and False)) # True
Какие операторы присваивания существуют?
Базовый оператор = и составные: +=, -=, *=, /=, //=, %=, **=, |=, &= и другие.
x = 10
x += 5 # x = x + 5
print(x) # 15
x //= 2 # 7
print(x) # 7
Как использовать моржовый оператор :=?
Оператор присваивания внутри выражения (walrus operator) появился в Python 3.8. Позволяет присвоить значение и сразу использовать его.
if (n := len([1, 2, 3])) > 2:
print(f"Длина {n} больше 2") # Длина 3 больше 2
Ошибки: можно случайно использовать == вместо :=. Моржовый оператор требует скобок в некоторых контекстах.
# Неправильно: if n = 5: # SyntaxError
# Правильно: if (n := 5): print(n)
Как использовать побитовые операторы?
Побитовые операторы: & (И), | (ИЛИ), ^ (исключающее ИЛИ), ~ (инверсия), << (сдвиг влево), >> (сдвиг вправо). Работают с целыми числами на уровне битов.
a = 0b1100 # 12
b = 0b1010 # 10
print(a & b) # 0b1000 (8)
print(a | b) # 0b1110 (14)
print(a ^ b) # 0b0110 (6)
print(~a) # -13 (дополнительный код)
print(a << 1) # 0b11000 (24)
print(b >> 1) # 0b0101 (5)
Как использовать побитовые операторы для флагов?
Часто применяются для упаковки нескольких булевых значений в одно целое число.
READ = 1 # 001
WRITE = 2 # 010
EXEC = 4 # 100
permissions = READ | WRITE # 011 (3)
if permissions & READ:
print("Чтение разрешено")
if permissions & EXEC:
print("Выполнение разрешено")
else:
print("Выполнение запрещено")
Проблемы: отрицательные числа при инверсии дают неожиданный результат из-за дополнительного кода. Для работы с беззнаковыми числами следует учитывать количество бит.
Как проверить принадлежность элемента?
Операторы in и not in проверяют, содержится ли элемент в последовательности (строка, список, кортеж, множество, словарь).
fruits = ["яблоко", "банан", "вишня"]
print("банан" in fruits) # True
print("груша" not in fruits) # True
print("а" in "Python") # False (регистрозависимо)
Как использовать in для проверки ключей словаря?
По умолчанию in проверяет ключи, не значения.
d = {"a": 1, "b": 2}
print("a" in d) # True
print(1 in d) # False
Ошибки: при проверке в строке учитывается регистр. Используйте методы lower() для регистронезависимого поиска.
Как проверить тождественность объектов?
Операторы is и is not проверяют, ссылаются ли две переменные на один и тот же объект в памяти. Это отличается от ==, который сравнивает значения.
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a is c) # True
print(a is b) # False
print(a == b) # True
Когда использовать is вместо ==?
Для сравнения с None или с singleton-объектами (например, булевы значения).
x = None
if x is None:
print("x равен None")
if True is True:
print("Это всегда True")
Ошибки: использование is для чисел и строк может давать неожиданный результат, потому что интерпретатор кеширует маленькие целые и короткие строки. Не стоит полагаться на это поведение.
a = 256
b = 256
print(a is b) # True (кеширование)
c = 257
d = 257
print(c is d) # False (обычно) - зависит от реализации
Дополнительные примеры использования операторов
Рассмотрим более сложные и редко используемые возможности операторов Python.
Примеры с побитовыми операторами и масками
# Установка и сброс битов
flag = 0b0000
flag |= 0b0101 # установить биты 0 и 2
print(bin(flag)) # 0b0101
flag &= ~0b0010 # сбросить бит 1
print(bin(flag)) # 0b0101 (бит 1 уже был 0)
# XOR для переключения битов
flag ^= 0b0011
print(bin(flag)) # 0b0110
0b0101 0b0101 0b0110
Использование оператора умножения матриц @
Оператор @ (Python 3.5+) предназначен для умножения матриц. Чаще всего применяется с библиотекой 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]]
Цепочки сравнений с разными типами
# Сравнение строк и чисел не поддерживается, но можно сравнивать строки по лексикографическому порядку
print("apple" < "banana") # True
print([1, 2] < [1, 3]) # True (сравнение элементов)
# Цепочка с разными операторами: a < b > c
print(5 < 10 > 3) # True (5 < 10 and 10 > 3)
True True True
Операторы присваивания с изменяемыми объектами
# Составное присваивание для списка: += изменяет список на месте
lst = [1, 2]
lst += [3, 4]
print(lst) # [1, 2, 3, 4]
# Но оператор * не работает для списков как составное присваивание (нужно использовать *=)
lst *= 2
print(lst) # [1, 2, 3, 4, 1, 2, 3, 4]
[1, 2, 3, 4] [1, 2, 3, 4, 1, 2, 3, 4]
Логические операторы с коротким замыканием и побочными эффектами
# or возвращает первый истинный операнд, не вычисляя остальные
def get_value():
print("Вызов get_value")
return 42
print(0 or get_value()) # Вызов get_value, затем 42
print(1 or get_value()) # 1 (get_value не вызывается)
Вызов get_value 42 1
Перегрузка операторов в пользовательском классе
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)
Vector(4, 6)
Использование оператора not in с генераторами
# Поиск значения в большом диапазоне с помощью генератора и not in
large_range = range(10_000_000)
print(5_000_000 not in large_range) # False (присутствует)
print(20_000_000 not in large_range) # True
False True