Коллбэки в Python
Функции и переменные
Функция — это объект. Такой же, как числа или строки. И так же, как числа или строки, их можно складывать в переменные.
Рассмотрим пример - возьмём встроенную функцию len()
, которая считает длину переданного ей аргумента:
a = len('Привет!')
b = len
print(a) # 7
print(b) # <built-in function len>
В первом случае мы вызывали (читай, запустили) функцию len
, передали ей строку и получили результат её работы: 7
. Его мы и записали в переменную a
.
Во втором случае функцию не вызывали, а сразу же записали в переменную. Теперь в b
лежит len
. Мы даже можем вызывать её оттуда:
b('Привет!') # 7
Получается, что если не вызывать функцию (не использовать круглые скобки), то ей можно оперировать как любым другим типом данных, как числом или строкой. А если функцию можно записывать в переменные, значит её можно передать аргументом на вход другой функции. Вот мы и добрались до коллбэков.
Что такое коллбэк
Коллбэк — это функция, которая передаётся на вход другой функции (или другому участку кода), чтобы её запустили в ответ на какое-то событие. С помощью этого приёма работают чатботы и интерактивные веб-странички: пользователь нажимает на кнопку, его действие генерирует событие и на событие реагирует коллбек (функция-обработчик). Рассмотрим пример:
from time import time_ns
def timeit(function):
start_time = time_ns()
function()
end_time = time_ns()
return end_time - start_time
timeit(print) # 28278 наносекунд
Функция timeit
принимает на вход любую другую функцию и засекает время её выполнения. Функция time_ns()
засекает текущее время.
Как вызвать коллбэк
Коллбэк вызывается так же, как и обычная функция:
def callback_function():
print("Я коллбэк")
callback = callback_fuction
callback()
Мы положили функцию в переменную, а потом вызвали её, поставив скобки. На экран вывелось “Я коллбэк”.
Создадим список из коллбэков:
def callback_1():
print("Я первый коллбэк")
def callback_2():
print("Я второй коллбэк")
def callback_3():
print("Я третий коллбэк")
callbacks = [callback_1, callback_2, callback_3] # Обратите внимание, что скобок нет.
# Мне нужны не результаты вызова функций, а сами функции
for callback in callbacks:
callback() # а вот здесь я уже вызываю функции
На экран выведутся все 3 надписи по порядку:
Я первый коллбэк
Я второй коллбэк
Я третий коллбэк
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.