我是python的新手。我正在分析一些代码片段以了解我到底有多远,检查我是否错过了python的一些关键概念,并且我被困在这里(键盘记录程序的一部分)。 / p>
$scope.vehicleDetail = function()
{
return "Vehicle type : " + $scope.vehicle.type + ", "+ $scope.vehicle.color;
};
OnKeyboardEvent是函数的标识符吗?要调用函数我们应该这样做:
def OnKeyboardEvent(event):
#statements...
return True
hookMgr = pyHook.HookManager()
hookMgr.KeyDown = OnKeyboardEvent # stuck here!
我的问题是为什么没有使用括号和参数?这是一个我不知道的不同概念吗?
我甚至试图分析发生了什么:
hookMgr.KeyDown = OnKeyboardEvent(some_argument)
它没有打印任何内容。它是否将标识符'foo'表示为函数而'foo'作为变量是不同的?
答案 0 :(得分:3)
是的,OnKeyboardEvent
是对函数本身的引用,而OnKeyboardEvent()
是对函数调用结果的引用。 hookMgr.KeyDown = OnKeyboardEvent
将hookMgr.KeyDown
连接到给定函数,类似于tkinter.Button(command=myfunction)
将函数连接的方式,而不是函数调用返回的值连接到Tkinter按钮。
答案 1 :(得分:1)
我将向您展示一些我认为可以帮助您理解Python的功能的示例。
def calc(func, a, b):
return func(a, b)
def add(a, b):
return a + b
def sub(a, b):
return a - b
print(calc(add, 2, 2)) # 4
print(calc(sub, 42, 1)) # 41
就是这样。你可以传递一些函数作为另一个函数的参数,或者将它存储在某个变量中,然后调用它等等。这非常有用,但有点不寻常。
顺便说一句,我最喜欢使用这个功能:使用带有函数的字典而不是(缺少)switch .. case
运算符。像这样:
def get_serialized_value(obj):
serializer = {
Article: article_brief_serialize,
RichTextArticle: rich_text_article_brief_serialize,
Gallery: gallery_serialize
}.get(type(obj))
return serializer(obj).data if serializer else None
# what was replaced by the code above..
def get_serialized_value(obj):
if type(obj) == Article:
return article_brief_serialize(obj)
elif type(obj) == RichTextArticle:
return rich_text_article_brief_serialize(obj)
elif type(obj) == Gallery:
return gallery_serialize(obj)
else:
return None
答案 2 :(得分:0)
关于python的一个好处是函数和类本身就是对象,因此可以作为变量传递。例如,具有另一个函数作为参数的函数可能类似于
def foo(bar):
bar()
您可以在其中调用它并输入任何函数的名称,它将调用您输入的函数而不带参数。通常这用于事件处理程序模型,在这种模型中,您将向对象传递对函数的引用,当事件发生时,对象将调用您的函数,这就是您调用的函数。