Почему у нас не может быть переменной, ссылающейся на функцию в python? - PullRequest
0 голосов
/ 25 мая 2018

Я изучаю Javascript и просто любопытно, что мы можем иметь переменную, относящуюся к функции в JS, но не в Python.Все в python является объектом, и функции в JS также являются объектами, но почему мы получаем ошибку, когда переменная ссылается на функцию.

Я предположил, что мы должны иметь возможность назначить функцию переменной, как в JS, потому что они являются объектами в обоих случаях.

**Javascript code**   
var add = function(a,b){
        return a+b
    };

    console.log(add(3,5)) // prints 8 in console.

, тогда как в python это выдает ошибку какна картинке ниже.

error

Ответы [ 5 ]

0 голосов
/ 25 мая 2018

Остальные ответы верны в отношении основных фактов: все, включая функции, является объектом и может быть присвоено переменной.Но 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, предоставив ему объект кода, представляющий скомпилированное тело, глобальную среду и, возможно, некоторые другие вещи, такие как значения по умолчанию и аннотации.

0 голосов
/ 25 мая 2018

Вы можете назначать функциональные объекты переменным в Python.Однако этого нельзя сделать одним оператором, по крайней мере при использовании ключевого слова def.Сначала вы должны определить функцию, затем вы можете присвоить объект функции переменной:

>>> def add(x, y):
...     return x + y
...
>>> a = add
>>> a(1, 2)
3
>>>

На самом деле, вышеприведенное действительно не нужно, поскольку Python позволяет напрямую связывать объекты функцийк именам переменных, что и делает слово def:

Определение функции - это исполняемый оператор. Его выполнение связывает имя функции в текущем локальном пространстве имен с объектом функции (обертка вокруг исполняемого кода функции).Этот функциональный объект содержит ссылку на текущее глобальное пространство имен в качестве глобального пространства имен, которое будет использоваться при вызове функции. (акцент мой)

0 голосов
/ 25 мая 2018

Вы можете.

def add(x,y):
    return x + y

a = add

ключевое слово def уже по существу присваивает функцию переменной (в данном случае add).

Если ваш вопрос "Почему в python нет синтаксического сахара, позволяющего мне давать вторую ссылку на функцию в одной строке ", это в основном основано на мнении.Вы можете посмотреть на PEP 20 , чтобы подумать об этом, хотя:

Должен быть один - и предпочтительно только один - очевидный способ сделать это.

0 голосов
/ 25 мая 2018

Вы можете назначать функции переменным в python.Попробуйте этот пример

def x():
    print(20)
y = x
y()

Вывод: 20

0 голосов
/ 25 мая 2018

Вы можете назначать функции в python переменным, но не одной строкой

def doit():
    print('Do something')

obj = {'myfunction': doit }

obj['myfunction']() # Do something

Или

def doit():
    print('Do something')

ref = doit

ref() # Do something
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...