← Назад к вопросам

Можно ли присвоить функцию переменной?

1.2 Junior🔥 161 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Присвоение функции переменной в Python

Да, в Python это не просто возможно — это один из ключевых принципов языка. Функции — это объекты первого класса (first-class objects), и их можно обрабатывать как любые другие данные.

Базовый пример

def greet(name):
    return f"Hello, {name}!"

# Присваиваем функцию переменной
say_hello = greet

# Вызываем через переменную
print(say_hello("Alice"))  # Output: Hello, Alice!

# Обе переменные указывают на один объект
print(greet is say_hello)  # Output: True

Практические применения

1. Передача функций как аргументов

def apply_operation(x, y, operation):
    return operation(x, y)

def add(a, b):
    return a + b

def multiply(a, b):
    return a * b

print(apply_operation(5, 3, add))       # 8
print(apply_operation(5, 3, multiply))  # 15

2. Возврат функций из функций

def create_multiplier(factor):
    def multiply(x):
        return x * factor
    return multiply

# Создаём новые функции
times_two = create_multiplier(2)
times_three = create_multiplier(3)

print(times_two(5))    # 10
print(times_three(5))  # 15

3. Функции в структурах данных

# Функции в словаре
operations = {
    'add': lambda x, y: x + y,
    'sub': lambda x, y: x - y,
    'mul': lambda x, y: x * y,
}

print(operations['add'](10, 5))  # 15

# Функции в списке
functions = [int, str, len]
print(functions[0]("42"))        # 42
print(functions[1](100))         # '100'

Lambda и анонимные функции

# Lambda функция в переменной
square = lambda x: x ** 2
print(square(4))  # 16

# Использование с map, filter, sorted
numbers = [1, 2, 3, 4, 5]
result = list(map(lambda x: x ** 2, numbers))
print(result)  # [1, 4, 9, 16, 25]

# Фильтрация
even = list(filter(lambda x: x % 2 == 0, numbers))
print(even)  # [2, 4]

Декораторы — практический пример

Декораторы используют это свойство для оборачивания функций:

def log_calls(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__}")
        result = func(*args, **kwargs)
        print(f"Result: {result}")
        return result
    return wrapper

@log_calls
def add(a, b):
    return a + b

add(5, 3)  # Выведет логи до и после вызова

Важные свойства функций

def example(x, y=10):
    return x + y

# Функция как объект имеет атрибуты
print(example.__name__)       # 'example'
print(example.__doc__)        # Документация
print(example.__code__)       # Код функции
print(type(example))          # <class 'function'>

# Можно добавлять собственные атрибуты
example.custom_attr = "value"
print(example.custom_attr)    # 'value'

Замыкания (Closures)

def make_counter():
    count = 0
    
    def increment():
        nonlocal count
        count += 1
        return count
    
    return increment

counter = make_counter()
print(counter())  # 1
print(counter())  # 2
print(counter())  # 3

Заключение

Присвоение функции переменной — это фундаментальная особенность Python, которая делает язык очень гибким. Это основа функционального программирования и используется повсеместно в декораторах, обработчиках событий и callback'ах.

Можно ли присвоить функцию переменной? | PrepBro