Не понимаю, что делает "@" в Python?
Можете пожалуйста объяснить с примерами
Дополненпростыми словами с примером
Посмотрите теорию по декораторам.
Синтаксический сахарок
Это когда питон ругается на тебя матом.
Декоратор, пример использования:
def my_decorator(func):
def wrapper():
print("Что-то происходит перед вызовом функции")
func()
print("Что-то происходит после вызова функции")
return wrapper
@my_decorator
def say_hello():
print("Привет, мир!")
say_hello()
ещё пример:
def say_hi(name):
return f'Привет, {name}!'
@say_hi
def my_name():
print('Крис')
вывод:
Привет, Крис!
Символ @ в Python имеет два основных применения, и я объясню оба с примерами:
1. Декораторы функций/классов (наиболее распространённое использование):
Представьте, что декоратор — это новогодняя упаковка для подарка. Сам подарок (функция) остаётся неизменным, но мы добавляем к нему дополнительную функциональность (обёртку).
Пример: Добавим логирование к функции:
# Декоратор-логгер
def logger(func):
def wrapper(*args, **kwargs):
print(f"Вызов функции {func.__name__}")
return func(*args, **kwargs)
return wrapper
# Применение через @
@logger
def calculate(a, b):
return a + b
# Тест
calculate(2, 3) # Выведет: "Вызов функции calculate" и вернёт 5
Что происходит:
1. @logger эквивалентно calculate = logger(calculate)
2. При вызове calculate() мы фактически вызываем wrapper()
2. Оператор матричного умножения (в научных вычислениях)
Пример с NumPy:
import numpy as np
# Создаём матрицы
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# Умножение матриц с помощью @
result = A @ B
# Эквивалентно np.matmul(A, B)
Как определить, о чём речь?
1. Если @ стоит перед определением функции/класса — это декоратор
2. Если @ используется между переменными в выражениях — это матричное умножение