Main()为什么在定义之前调用函数?

时间:2017-07-27 15:58:40

标签: python python-3.x function object

因此,使用main()方法可以在函数被定义之前调用函数:

enter code here
def main(): 
    useless_function() 
def useless_function():
    print(" Oh, so this is what I do!")

if __name__ == "__main__": main()

为什么这是一件事?为什么要在对象存在之前调用它?

3 个答案:

答案 0 :(得分:2)

在Python中创建函数时,不会对正文进行评估或检查(除了解析)。当你调用该函数时,它会执行。它寻找" useless_function"在函数的本地范围内。如果它找不到它,Python会在下一个更高的范围内查找它(在本例中为global)。如果它没有成功地耗尽这些可能性,则抛出NameError异常。

def f1():
    return f2()

try:
    f1()
except NameError:
    print('Name error!')

def f2():
    print('Hello')

f1()

def f2():
    print('Hello World')

f1()

上述程序的输出是:

Name error!
Hello
Hello World

如果没有这种行为,请尝试思考如何创建一对递归函数(f1调用f2调用f1 ...)。

清除误解的关键是实现指令useless_function()实际上是两条指令:

  1. 获取名称为useless_function

  2. 的对象
  3. 调用对象的名为__call__

  4. 的方法

    由于第一步不是在创建函数时执行,而是在每次函数调用时都执行,因此您会看到问题中询问的行为

答案 1 :(得分:0)

如果你问为什么会这样 - Python会从上到下解析所有内容,但在你调用函数之前,不会执行内部函数代码。

由于您在if __name__ == "__main__": main()定义后进行了useless_function()来电,因此main()呼叫useless_function()并且无效,因为useless_function()存在那时候。

如果您问为什么允许这样做 - 请在OOP设置中考虑这一点。类也可以从上到下阅读但是如果你不允许方法相互调用而不管它们的位置如何,那么就不会有太多的OOP可以谈论。只要在实际执行之前解析整个父/封闭结构 - 内部顺序并不重要。

答案 2 :(得分:0)

当Python遇到useless_function()中的main代码行时,它基本上生成了这些指令:

  • 获取以该名称引用的对象
  • 调用它(即调用其__call__方法)

如您所见,此时无需定义useless_function。它必须在调用main时存在。

尝试此操作以查看我们可以将名称指定给其他对象:

def another_function():
    print("What?!")

然后:

main()
useless_function = another_function
main()