为什么我们不能在python中有变量引用函数?

时间:2018-05-24 21:10:21

标签: javascript python function

我正在学习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 :(得分:7)

你可以。

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

a = add

def关键字实际上已将函数分配给变量(在本例中为add)。

如果你的问题是“为什么python没有语法糖来允许我在单行上给函数提供第二个变量引用”,那么它主要是基于意见的。不过,你可以看一下PEP 20的想法:

  

应该有一个 - 最好只有一个 - 显而易见的方法。

答案 1 :(得分:6)

其他答案对于基本事实是正确的:包括函数在内的所有东西都是一个对象,可以分配给一个变量。但是def是一个语句,而不是一个表达式,因此它没有函数值,它根本就没有值。

但是def不是在Python中定义函数的唯一方法。还有lambda 1 这是一个表达式,并且函数值为值。因为它是一个表达式,所以它的主体必须是一个表达式,它只能包含其他表达式,并返回该表达式的值。但在你的例子中,这不是一个限制;你的整个函数体只是return一个表达式。所以:

add = lambda a, b: a+b

这在Python中被认为是糟糕的风格。 lambda的整个点是(a)它不给函数命名,(b)它可以在表达式中使用。如果你只是为一个GUI按钮编写一次性回调,那就太好了 - 但是在这里,我们在这里做的唯一事情是在赋值表达式中使用它来给它命名。

换句话说,这只是一个不太清晰的版本:

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构造函数,给它一个代表编译体的代码对象,一个全局环境,以及一些其他的东西,比如默认值和注释。 < / p>

答案 2 :(得分:5)

您可以在Python中为变量分配函数对象。但是,这不能在单个语句中完成,至少在使用def关键字时是这样。您必须先定义函数,然后才能将函数对象赋值给变量:

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

实际上,上面的内容实际上是不必要的,因为Python允许你直接将函数对象绑定到变​​量名,这就是def单词的作用:

  

函数定义是可执行语句。 它的执行将当前本地命名空间中的函数名称绑定到一个函数对象(该函数的可执行代码的包装器)。此函数对象包含对当前全局命名空间的引用,作为调用函数时要使用的全局命名空间。 (强调我的)

答案 3 :(得分:1)

您可以将python中的函数分配给变量,但不能分配到一行

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

obj = {'myfunction': doit }

obj['myfunction']() # Do something

或者

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

ref = doit

ref() # Do something

答案 4 :(得分:0)

您可以在python中为变量分配函数。试试这个例子

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

输出:20