如果在python中定义函数之前调用函数,它怎么能工作?

时间:2013-11-12 21:34:34

标签: python main

我想知道if __name__ == "__main__":在python中真正做了什么,我在python3中有以下代码:

def main():
    test();

def test():
    print("hello world " + __name__);

if __name__ == "__main__":
    main();

我们知道在使用之前我们必须声明一个函数,因此if部分内的函数调用工作正常,main()if内调用之前定义语句,但是test()函数怎么样,它在被调用后定义并且没有错误:

def main():
    test();

def test():
    print("hello world " + __name__);

那么如果test()函数在被调用后被定义了怎么能呢?

4 个答案:

答案 0 :(得分:5)

调用后,测试。订单是:

  1. 定义main。这引用了一个(尚未定义的)test,但实际上并没有使用(调用)它。 Python就可以了。
  2. 定义test
  3. 致电main
  4. main来电test。没问题,因为它已经定义了。

答案 1 :(得分:1)

这里的问题实际上与if __name__ == 'main'无关。请考虑以下代码:

def do_something():
    do_something_else()

以上是有效的函数声明。 即使我还没有写do_something_else()。您可以在交互式口译员中尝试这一点。现在,当我实际致电 do_something()时:

do_something()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-21-3d57cd7a951b> in <module>()
----> 1 do_something()

<ipython-input-20-5d71722aad44> in do_something()
      1 def do_something():
----> 2     do_something_else()
      3 

NameError: global name 'do_something_else' is not defined

错误了。如果在调用do_something()之前的某个时刻,我已经定义了do_something_else函数,那就不会了。

那么,这是什么意思? Python确实从上到下解释。但是当达到函数定义时,它只是编译函数,它不会执行它。

答案 2 :(得分:0)

Python按照它看到的顺序执行代码。

您键入def main():它将其作为函数定义以便稍后运行。

if __name__ == "__main__":检查当前文件是否应该运行(而不是包含)。在这种情况下,它将执行以下任何内容(通常为main

你可以这样说:

print "here"
def main():
  print "in main"

if __name__ == "__main__"
  main()

你应该看到像

这样的输出
here
in main

这是因为python本质上是一种脚本语言,函数是可选的。 对于任何不打算在接下来的10分钟内抛弃的代码,你应该使用函数和类。它们使代码更容易理解跟随和调试。

您的特定代码工作的原因(在main之后定义测试)是您在定义所有内容后运行它。除非你运行main,否则Python不会尝试检查是否有test被调用。当您运行main时,test已经定义。

答案 3 :(得分:0)

  

我们知道在使用它之前必须声明一个函数

听起来你是来自C家族的一种语言。这些语言在两个方面有所不同。

首先,Python没有“声明”任何东西。这在C语言中是有意义的,其中变量是值存储的类型化内存位置。但是在Python中,值具有它们自己的独立类型和位置,变量只是这些值的名称,因此没有任何要声明的内容。 / p>

现在,Python要求你在使用之前定义一个函数,就像C一样。

但只有C 要求您在编译其正文使用它的函数之前定义或至少声明一个函数。区别与上面相同 - C需要声明的函数,获取类型,指向函数实际代码的指针等;在Python中,该函数只是函数对象值的名称。要编译一个函数,它需要知道的是查找名称的位置。这很简单:它编译函数,以便在运行时,它将查找模块全局变量中的名称。由于不需要其他信息,因此无需申报。

例如,在C中,这是合法的:

void foo() {}
void bar() { foo(); }

这就是:

void foo();
void bar() { foo(); }
void foo() {}

但这不是:

void bar() { foo(); }
void foo();

在Python中,因为没有声明,所以第二个和第三个是相同的,因此都是完全有效的:

def bar():
    foo()
def foo():
    pass