Как в Python передать одну функцию в качестве аргумента в другую

«Как в Python передать одну функцию в качестве аргумента в другую» — вопрос из категории Python, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, в Python функции являются объектами первого класса. Это означает, что с ними можно обращаться так же, как и с любыми другими объектами (числами, строками, списками): присваивать переменным, хранить в структурах данных и, в том числе, передавать в качестве аргументов в другие функции.

Такие функции, которые принимают другие функции в качестве аргументов или возвращают их, называются функциями высшего порядка.

Пример:

# Функция, которую мы будем передавать
def say_hello(name):
    return f"Hello, {name}!"

# Функция высшего порядка, которая принимает другую функцию
def process_greeting(greeter_func, user_name):
    # Вызываем переданную функцию с аргументом
    print(greeter_func(user_name))

# Передаем функцию say_hello как аргумент
process_greeting(say_hello, "Alice")
# Вывод: Hello, Alice!

Почему это важно?

Этот механизм лежит в основе многих мощных концепций в Python:

  • Декораторы: "Оборачивают" другие функции для расширения их функциональности.
  • Callback-функции: Позволяют указать, какая функция должна быть вызвана после завершения асинхронной операции или другого события.
  • Функциональное программирование: Функции map(), filter(), reduce() принимают функции для обработки итерируемых объектов.

Также можно передавать анонимные (лямбда) функции:

process_greeting(lambda name: f"Hi, {name}!", "Bob")
# Вывод: Hi, Bob!