Python函数调用顺序

时间:2017-07-11 03:45:56

标签: python call interpreter

当你运行它时,Python如何“读入”一个程序?例如,我不明白为什么下面的代码中没有NameError: name 'cough' is not defined

def main():
    for i in range(3):
        cough()


def cough():
    print('cough')


if __name__ == '__main__':
    main()

基本上,我的问题也可以说明为什么上面和下面的程序输出相同的东西:

def cough():
    print('cough')


def main():
    for i in range(3):
        cough()


if __name__ == '__main__':
    main()

5 个答案:

答案 0 :(得分:10)

Python是解释语言按语句执行声明 (感谢viraptor的提示:当编译为字节码时,它发生在整个文件+每个函数上)

在这种情况下,程序会逐行读取并知道函数cough()main()已定义。稍后当调用main()时,Python会知道它是什么以及main()何时调用cough() Python也知道它是什么。

def cough():
    print('cough')


def main():
    for i in range(3):
        cough()


if __name__ == '__main__':
    main()

在另一个案例中(下文),它是一回事。只是Python在main()之前了解cough()函数是什么。在这里你可能想知道:“为什么python不会抛出错误,因为它不知道caugh()里面main()是什么?”好问我的朋友。

但是只要你在调用它之前定义了你的函数,一切都很好。因为记住 Python不会“检查”函数是否被定义,直到你调用它。所以在这种情况下甚至当python正在读取函数cough()时没有定义main()没关系,因为我们在下面定义main()之后才调用cough()

def main():
    for i in range(3):
        cough()


def cough():
    print('cough')


if __name__ == '__main__':
    main()

希望这有助于您更好地理解Python。

答案 1 :(得分:2)

防止错误发生的代码是:

if __name__ == '__main__':
    main()

因为你把它放在代码的末尾,在python之后阅读上面的所有代码。 如果您尝试编写类似

的内容
def main():
    for i in range(3):
        cough()

if __name__ == '__main__':
    main()

def cough():
    print('cough')

你要得到的就是:

NameError: name 'cough' is not defined

答案 2 :(得分:1)

当Python在执行源代码时遇到函数时,它不会立即运行该函数。相反,它将函数编译为可执行代码对象,并等待直到您实际调用该函数。

这意味着,只有当您调用cough()时,Python才会检查main() 定义的唯一时间。由于Python在调用cough时确实找到main函数,因此不会引发错误。

换句话说: Python不会在运行时验证函数中使用的名称是否实际存在,因此您可以使用当前未定义的变量名称

这与此类函数在定义时不会引发错误的原因相同,但在运行时它会发生错误:

>>> def func():
    a + b

>>> func # func was compiled...
<function func at 0x7f8ddd5d6488>
>>> func() # but we cannot call it.
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    func() # but we cannot call it.
  File "<pyshell#7>", line 2, in func
    a + b
NameError: name 'a' is not defined
>>> 

另请注意,如果您在定义咳嗽之前尝试拨打main ,则收到错误:

>>> def main():
    for i in range(3):
        cough()


>>> main()
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    main()
  File "<pyshell#12>", line 3, in main
    cough()
NameError: name 'cough' is not defined
>>> 

这表明Python在您尝试使用它们之前,依赖于函数中的每个名称,无论是全局还是本地,都已定义。

答案 3 :(得分:0)

Python从脚本顶部读取到底部。在这两个示例中,cough()函数在定义后调用。

当您在main()内定义cough()时,cough()函数实际上并未运行。直到最后一行才会运行 - 也就是在它们已经定义之后。

答案 4 :(得分:0)

那是因为真正的执行代码在这里

如果名称 ==&#39; 主要&#39;:     main()的

当调用main()时,已经定义了main和cough