Функции — это объекты первого класса
Я уже упоминал мантру Python: объектами является все, включая числа, строки, кортежи, списки, словари и даже функции. Функции в Python являются объектами первого класса. Вы можете присвоить их переменным, использовать как аргументы для других функций и возвращать из функций. Это дает вам возможность решать с помощью Python такие задачи, справиться с которыми средствами многих других языков сложно, если не невозможно.
Для того чтобы убедиться в этом, определим простую функцию answer(), которая не имеет аргументов и просто выводит число 42:
>>>> def answer():
>…·····print(42)
Вы знаете, что получите в качестве результата, если запустите эту функцию:
>>>> answer()
>42
Теперь определим еще одну функцию с именем run_something. Она имеет один аргумент, который называется func и представляет собой функцию, которую нужно запустить. Эта функция просто вызывает другую функцию:
>>>> def run_something(func):
>…·····func()
Если мы передадим answer в функцию run_something(), то используем ее как данные, прямо как и другие объекты:
>>>> run_something(answer)
>42
Обратите внимание: вы передали строку answer, а не answer(). В Python круглые скобки означают «вызови эту функцию». Если скобок нет, Python относится к функции как к любому другому объекту. Это происходит потому, что, как и все остальное в Python, функция является объектом:
>>>> type(run_something)
>
Попробуем запустить функцию с аргументами. Определим функцию add_args(), которая выводит на экран сумму двух числовых аргументов, arg1 и arg2:
>>>> def add_args(arg1, arg2):
>…·····print(arg1 + arg2)
Чем является add_args()?
>>>> type(add_args)
>
Теперь определим функцию, которая называется run_something_with_args() и принимает три аргумента:
• func — функция, которую нужно запустить;
• arg1 — первый аргумент функции func;
• arg2 — второй аргумент функции func:
>>>> def run_something_with_args(func, arg1, arg2):
>…·····func(arg1, arg2)
Когда вы вызываете функцию run_something_with_args(), та функция, что передается вызывающей стороной, присваивается параметру func, а переменные arg1 и arg2 получают значения, которые следуют далее в списке аргументов. Вызов func(arg1, arg2) выполняет данную функцию с этими аргументами, потому что круглые скобки указывают Python сделать это.
Проверим функцию run_something_with_args(), передав ей имя функции add_args и аргументы 5 и 9:
>>>> run_something_with_args(add_args, 5, 9)
>14
Внутри функции run_something_with_args() аргумент add_args, представляющий собой имя функции, был присвоен параметру func, 5 — параметру arg1, а 9 — параметру arg2. В итоге получается следующая конструкция: