Поскольку функции являются объектами, можно передавать их в качестве аргументов другим функциям. Функция talk()
, которая изменяет строку, используя переданный ей объект функции, а затем печатает ее:
def talk(say): prt = say('Мир') print(prt)
Вы можете влиять на полученное сообщение, передавая различные функции:
def hello(name): return f'Привет {name}.' def goodbye(name): return f'Пока {name}.' >>> talk(hello) # Привет Мир. >>> talk(goodbye) # Пока Мир.
Важно. Функция hello
передается функции talk()
без скобок. Это означает, что передается только ссылка на функцию hello
. Функция при этом не выполняется. Функция talk()
, записывается со скобками, поэтому она будет вызываться как обычно.
Возможность передавать функциональные объекты в качестве аргументов другим функциям является мощной фишкой. Это позволяет абстрагироваться от функционала и передать поведение. В примере выше функция talk()
остается прежней, но сохраняет возможность влиять на ее вывод, передавая различные варианты сообщений.
Функции, которые могут принимать другие функции в качестве аргументов, также называются функциями высшего порядка. Они необходимы для функционального стиля программирования.
Классическим примером функций высшего порядка в Python является встроенная функция map()
. Она принимает в качестве аргументов функцию и итерируемую последовательность и вызывает функцию для каждого элемента в последовательности.
Вот как можно отформатировать последовательность имен, сопоставив им функцию приветствия hello()
:
>>> list(map(hello, ['Юля', 'Миша', 'Андрей', 'София'])) # ['Привет Юля.', 'Привет Миша.', # 'Привет Андрей.', 'Привет София.']