Простой Python. Современный стиль программирования (Любанович) - страница 66

Функции — это объекты первого класса

Я уже упоминал мантру 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. В итоге получается следующая конструкция: