Все данные в программе Python представлены объектами или отношениями между объектами. Такие вещи, как строки, списки, модули и функции, являются объектами. В Python нет ничего особенного в функциях.
Так как функция в Python является объектом, ее можно присвоить другой переменной, как и любому другому объекту:
def hello(name): return f'Hello {name}.' >>> say = hello
Строка say = hello
не вызывает функцию. Он принимает объект функции, на который ссылается hello
и создает второе имя say
указывающее на нее. Теперь можно выполнить объект базовой функции hello
, вызвав say
:
>>> 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