首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python函数调用顺序

Python函数调用顺序
EN

Stack Overflow用户
提问于 2017-07-11 03:45:56
回答 5查看 7.7K关注 0票数 5

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

代码语言:javascript
运行
复制
def main():
    for i in range(3):
        cough()


def cough():
    print('cough')


if __name__ == '__main__':
    main()

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

代码语言:javascript
运行
复制
def cough():
    print('cough')


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


if __name__ == '__main__':
    main()
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-07-11 03:51:32

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

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

代码语言:javascript
运行
复制
def cough():
    print('cough')


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


if __name__ == '__main__':
    main()

在另一种情况下(下面),这是一回事。仅仅是Python在cough()之前就知道了什么是cough()函数。在这里,您可能会想:“为什么python不抛出一个错误,因为它不知道caugh()main()中是什么”,很好的问题,我的朋友。

但是,只要在调用之前定义了函数,一切都很好。因为请记住,在调用函数之前不会“检查”是否定义了函数。因此,在本例中,即使是在python读取函数main()时,也没有定义tho cough(),因为在下面定义了main()之后,我们才调用main()

代码语言:javascript
运行
复制
def main():
    for i in range(3):
        cough()


def cough():
    print('cough')


if __name__ == '__main__':
    main()

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

票数 11
EN

Stack Overflow用户

发布于 2017-07-11 03:56:57

防止错误发生的代码如下:

代码语言:javascript
运行
复制
if __name__ == '__main__':
    main()

因为在python阅读了上面的所有代码之后,您将它放在代码的末尾。如果你想写这样的东西

代码语言:javascript
运行
复制
def main():
    for i in range(3):
        cough()

if __name__ == '__main__':
    main()

def cough():
    print('cough')

你要做的就是:

代码语言:javascript
运行
复制
NameError: name 'cough' is not defined
票数 2
EN

Stack Overflow用户

发布于 2017-07-11 03:57:26

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

这意味着Python唯一一次检查cough()是真正定义的,是在调用main()时。而且,由于Python在调用cough时确实找到了main函数,因此不会引发错误。

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

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

代码语言:javascript
运行
复制
>>> 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,则会得到一个错误:

代码语言:javascript
运行
复制
>>> 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依赖于函数中的每个名称,无论是全局的还是本地的,在尝试使用它们之前都已经定义好了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45025005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档