Все данные в программе Python представлены объектами или отношениями между объектами. Такие вещи, как строки, списки, модули и функции, являются объектами. В Python нет ничего особенного в функциях.
Так как функция в Python является объектом, ее можно присвоить другой переменной, как и любой другой объект:
def hello(name): return f'Hello {name}.' >>> say = hello
Строка say = hello не вызывает функцию. В строке объявляется переменная say, которая присваивает объект функции, на который ссылается hello, то есть уже две переменные say и hello указывают на один объект функции:
>>> say('World') # 'Hello World.'
Функциональные объекты и их имена являются двумя разными вещами. Вот еще одно доказательство: можно удалить исходное имя функции hello. Другое имя say по-прежнему указывает на базовую функцию hello и ее можно вызвать через функцию say:
>>> del hello >>> hello('World') # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # NameError: name 'hello' is not defined >>> say('World') # 'Hello World.'
Python присоединяет строковый идентификатор к каждой функции во время создания для целей отладки. Можете получить доступ к этому внутреннему идентификатору с помощью атрибута __name__ или __qualname__:
>>> say.__name__ 'hello' >>> say.__qualname__ 'hello'
Хотя атрибут __name__ функции say() все еще hello, это не повлияет на то, как можно получить к ней доступ из кода. Этот атрибут является просто средством отладки. Переменная, указывающая на функцию и сама функция - две разные вещи.
Также можно вызывать несколько функций внутри однострочника if/else.
Например:
def add(a, b): return a + b def subtract(a, b): return a - b >>> a, b = 4, 5 >>> (subtract if a > b else add)(a, b) # 9