Остальные ответы верны в отношении основных фактов: все, включая функции, является объектом и может быть присвоено переменной.Но def
является оператором, а не выражением, поэтому у него нет значения функции, оно вообще не имеет значения.
Но def
не единственный способ определить функции в Python,Также есть lambda
. 1 . Это выражение и значение функции в качестве значения.Поскольку это выражение, его тело должно быть выражением, которое может содержать только другие выражения, и оно возвращает значение этого выражения.Но в вашем примере это не ограничение;все ваше тело функции просто return
выражение.Итак:
add = lambda a, b: a+b
Это считается плохим стилем в Python.Весь смысл лямбды в том, что (а) она не дает функции имя и (б) ее можно использовать внутри выражения.Прекрасно, если вы просто пишете одноразовый обратный вызов, например, для кнопки с графическим интерфейсом, но здесь единственное, что мы здесь делаем, - это используем его в выражении присваивания, чтобы дать ему имя.
Другими словами, это просто менее понятная версия:
def add(a, b): return a+b
Это уже делает именно то, что вы хотите: определяет функцию и присваивает ей имя переменной add
втекущее пространство имен.Кроме того, версия def
предоставляет вам лучшие возможности для самоанализа / отражения (например, add.__name__
будет add
вместо чего-то бесполезного, например __main__.<lambda>
).И, поскольку это оператор, вы можете помещать сложные операторы внутри тела.
И, поскольку add
- это просто нормальное имя переменной, а функция - просто нормальное значение, конечно, вытакже можно сделать это:
def _add(a, b): return a+b
add = _add
del _add
... но опять же, нет никакого смысла;это просто менее понятная и более подробная версия def add
(и с неправильными __name__
и, возможно, другими атрибутами).
1.Для полноты, есть и третий способ: вы можете использовать конструктор types.FunctionType
, предоставив ему объект кода, представляющий скомпилированное тело, глобальную среду и, возможно, некоторые другие вещи, такие как значения по умолчанию и аннотации.