解决Python 函数声明先后顺序出现的问题
在Python中如果把函数定义写在调用的下方可能会出错,例如下面的代码
foo() deffoo(): print("hello")
执行时会报出错误
NameError:name'foo'isnotdefined
这时候要把foo()调用代码放到该函数的声明后面
deffoo(): print("hello") foo()
这样执行就一切正常了。这仿佛像是C语言中的函数调用需要提前声明一般,例如在C语言中要调用后头的定义的函数要写成
voidfoo(); intmain(){ foo(); } voidfoo(){ printf("Hello"); }
实际上Python中并不存在函数提前声明一说,也不能像Java那样函数可以写在任意位置,因为Java是编译型的语言,Python是解释型的。
而且也不是一定要求被调用的函数一定要在源代码层面上定义在调用者前方。
Python中函数声明的顺序据我理解有两条规则
- Python源代码是由上往下解释的
- 找到程序入口(未包含在函数中的代码)即开始执行,执行到的函数未被先行解释到即报错
分析下面两段代码
deffoo(): bar() if__name__=='__main__': foo() defbar(): print("hello")
Python从第1行一直解释到第4行的入口,进而往回跳,调用到第1行的foo()函数,而其中的bar()函数还未及被解释到,所以会提示
NameError:name'bar'isnotdefine
有一个很好的分析工具http://pythontutor.com/live.html#mode=edit,我们来看上面的代码
解释到第二行bar()的时候,Globalframe里只有foo,bar还不存在
如果把程序入口往后调
deffoo(): bar() defbar(): print("hello") if__name__=='__main__': foo()
上面代码执行无误,输出
hello
foo()调用的bar()不也是在它下方声明的吗?所以这一点与C是有区别的。
也用http://pythontutor.com/live.html#mode=edit来看看
解释到第8行的时候在Globalframe中foo,bar都有了,所以能成功调用。
这时候的理解是这样的,Python从第1行自上往下解释到第7行的程序入口时,foo()并未实际调用bar(),但foo()和bar()函数都已解释到了,所以回过头来foo()与bar()之间怎么调用都无妨。
因此,最好的实践方法就是把程序的入口放到代码的最下方,那么它前面的函数不管如何的声明顺序都没有关系。
以上就是解决Python函数声明先后顺序的问题的详细内容,更多关于python函数声明顺序的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。