我正在学习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中它给出了如下图所示的错误。
答案 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