时间:2021-05-22
在 Python 中如果把函数定义写在调用的下方可能会出错,例如下面的代码
foo()def foo(): print("hello")执行时会报出错误
NameError: name 'foo' is not defined
这时候要把 foo() 调用代码放到该函数的声明后面
def foo(): print("hello")foo()这样执行就一切正常了。这仿佛像是 C 语言中的函数调用需要提前声明一般,例如在 C 语言中要调用后头的定义的函数要写成
void foo(); int main() { foo();} void foo() { printf("Hello");}实际上 Python 中并不存在函数提前声明一说,也不能像 Java 那样函数可以写在任意位置,因为 Java 是编译型的语言,Python 是解释型的。
而且也不是一定要求被调用的函数一定要在源代码层面上定义在调用者前方。
Python 中函数声明的顺序据我理解有两条规则
分析下面两段代码
def foo(): bar() if __name__ == '__main__': foo() def bar(): print("hello")Python 从第 1 行一直解释到第 4 行的入口,进而往回跳,调用到第 1 行的 foo() 函数,而其中的 bar() 函数还未及被解释到,所以会提示
NameError: name 'bar' is not define
有一个很好的分析工具 http://pythontutor.com/live.html#mode=edit,我们来看上面的代码
解释到第二行 bar() 的时候,Global frame 里只有 foo, bar 还不存在
如果把程序入口往后调
def foo(): bar() def bar(): print("hello") if __name__ == '__main__': foo()上面代码执行无误,输出
hello
foo() 调用的 bar() 不也是在它下方声明的吗?所以这一点与 C 是有区别的。
也用http://pythontutor.com/live.html#mode=edit 来看看
解释到第 8 行的时候在 Global frame 中 foo, bar 都有了,所以能成功调用。
这时候的理解是这样的,Python 从第 1 行自上往下解释到第 7 行的程序入口时,foo() 并未实际调用 bar(),但 foo() 和 bar() 函数都已解释到了,所以回过头来 foo() 与 bar() 之间怎么调用都无妨。
因此,最好的实践方法就是把程序的入口放到代码的最下方,那么它前面的函数不管如何的声明顺序都没有关系。
以上就是解决Python 函数声明先后顺序的问题的详细内容,更多关于python 函数声明顺序的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
nodejs实现函数串行执行众所周知,nodejs是用非阻塞异步io机制,也就是说函数执行完成的先后顺序和代码的编写的先后顺序可能不同,实际的顺序取决于一个函数
程序化结构设计语言中的三种基本结构是顺序结构、选择结构、循环结构。具体介绍如下: 1、顺序结构 顺序结构表示程序中的各操作是按照它们出现的先后顺序执行的,这
本文介绍了通过设置启动程序的先后顺序解决KIS加密服务器提示SQL服务未启动和不能自动最小化的问题。(1)新建一个文件夹,例如:C:\OrderedLaunch
PPT制作课件时经常会遇到连线题,一般我们都是按题目的先后顺序设置动画,播放时单击鼠标,按顺序出现连线。可不可以打乱顺序,点击哪个项目就出现连接线呢?下面我们就
第一:action是form的属性,html5已经将其定义为必需的属性值,onSubmit为事件,通过提交时进行一个函数验证。。第二:要说执行的先后顺序,个人理