无法理解python中的语法

时间:2015-11-29 06:26:09

标签: python

我是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'作为变量是不同的?

3 个答案:

答案 0 :(得分:3)

是的,OnKeyboardEvent是对函数本身的引用,而OnKeyboardEvent()是对函数调用结果的引用。 hookMgr.KeyDown = OnKeyboardEventhookMgr.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()

您可以在其中调用它并输入任何函数的名称,它将调用您输入的函数而不带参数。通常这用于事件处理程序模型,在这种模型中,您将向对象传递对函数的引用,当事件发生时,对象将调用您的函数,这就是您调用的函数。