Top.Mail.Ru
Ответы

Не понимаю, что делает "@" в Python?

Можете пожалуйста объяснить с примерами

Дополнен

простыми словами с примером

По дате
По Рейтингу
Аватар пользователя
Новичок
2мес

Посмотрите теорию по декораторам.

Аватар пользователя
Высший разум
2мес

Синтаксический сахарок

Аватар пользователя
Просветленный
2мес

Это когда питон ругается на тебя матом.

Аватар пользователя
Оракул
2мес

Декоратор, пример использования:

12345678910111213
 def my_decorator(func): 
 def wrapper(): 
 print("Что-то происходит перед вызовом функции") 
 func() 
 print("Что-то происходит после вызова функции") 
 return wrapper 
 
@my_decorator 
def say_hello(): 
 print("Привет, мир!") 
 
say_hello() 
 

ещё пример:

12345678910
 def say_hi(name): 
 return f'Привет, {name}!' 
 
@say_hi 
def my_name(): 
 print('Крис') 

вывод:
Привет, Крис! 
 
Аватар пользователя
Мастер
2мес

Символ @ в Python имеет два основных применения, и я объясню оба с примерами:
1. Декораторы функций/классов (наиболее распространённое использование):
Представьте, что декоратор — это новогодняя упаковка для подарка. Сам подарок (функция) остаётся неизменным, но мы добавляем к нему дополнительную функциональность (обёртку).

Пример: Добавим логирование к функции:

1234567891011121314
 # Декоратор-логгер 
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:

123456789
 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. Если @ используется между переменными в выражениях — это матричное умножение