На этом шаге мы рассмотрим особенности такой передачи.
Поскольку функции являются объектами, их можно передавать в качестве аргументов другим функциям. Вот функция greet(), которая форматирует строковое значение приветствия, используя переданный в нее объект-функцию, и затем его печатает:
>>> def greet(func): greeting = func('Привет! Я - программа Python') print(greeting)
На результирующее приветствие можно влиять, передавая различные функции. Ниже показано, что происходит, если в функцию greet() передать функцию bark:
>>> greet(bark)
'ПРИВЕТ! Я - ПРОГРАММА PYTHON'
Разумеется, можно также определить новую функцию, чтобы сгенерировать приветствие с другим колоритом. Например, следующая функция whisper() может сработать лучше, если вы не хотите, чтобы ваши программы Python походили на Оптимуса Прайма из мультсериалов:
>>> def whisper(text): return text.lower() + '...' >>> greet(whisper) привет! я - программа python...
Способность передавать объекты-функции в другие функции в качестве аргументов имеет мощные последствия. Она позволяет в своих программах абстрагироваться и раздавать поведение. В этом примере функция greet() остается прежней, но вы можете влиять на ее результат, передавая различные линии поведения приветствия.
Функции, которые в качестве аргументов могут принимать другие функции, также называются функциями более высокого порядка (higher-order functions). Они являются непременным условием функционального стиля программирования.
Классическим примером функций более высокого порядка в Python является встроенная функция map(). Она принимает объект-функцию и итерируемый объект и затем вызывает эту функцию с каждым элементом итерируемого объекта, выдавая результат по мере прохождения итерируемого объекта.
Ниже показано, как вы могли бы отформатировать всю последовательность приветствий сразу, применив к ним функцию bark():
>>> list(map(bark, ['здравствуй', 'эй', 'привет'])) ['ЗДРАВСТВУЙ!', 'ЭЙ!', 'ПРИВЕТ!']
Как видите, функция более высокого порядка map() обошла весь список и применила функцию bark() к каждому его элементу. В результате у нас теперь новый объект-список с измененными приветственными строковыми значениями.
На следующем шаге мы рассмотрим вложенность функций.