gpt4 book ai didi

解决Python 函数声明先后顺序出现的问题

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章解决Python 函数声明先后顺序出现的问题由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

在 Python 中如果把函数定义写在调用的下方可能会出错,例如下面的代码 。

?
1
2
3
4
foo()
 
def foo():
  print ( "hello" )

执行时会报出错误 。

NameError: name 'foo' is not defined 。

这时候要把 foo() 调用代码放到该函数的声明后面 。

?
1
2
3
4
def foo():
  print ( "hello" )
 
foo()

这样执行就一切正常了。这仿佛像是 C 语言中的函数调用需要提前声明一般,例如在 C 语言中要调用后头的定义的函数要写成 。

?
1
2
3
4
5
6
7
8
9
void foo();
 
int main() {
  foo();
}
 
void foo() {
  printf( "Hello" );
}

实际上 Python 中并不存在函数提前声明一说,也不能像 Java 那样函数可以写在任意位置,因为 Java 是编译型的语言,Python 是解释型的.

而且也不是一定要求被调用的函数一定要在源代码层面上定义在调用者前方.

Python 中函数声明的顺序据我理解有两条规则 。

  • Python 源代码是由上往下解释的
  • 找到程序入口(未包含在函数中的代码) 即开始执行,执行到的函数未被先行解释到即报错

分析下面两段代码 。

?
1
2
3
4
5
6
7
8
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,我们来看上面的代码 。

解决Python 函数声明先后顺序出现的问题

解释到第二行 bar() 的时候,Global frame 里只有 foo, bar 还不存在 。

如果把程序入口往后调 。

?
1
2
3
4
5
6
7
8
def foo():
  bar()
 
def bar():
  print ( "hello" )
 
if __name__ = = '__main__' :
  foo()

上面代码执行无误,输出 。

hello 。

foo() 调用的 bar() 不也是在它下方声明的吗?所以这一点与 C 是有区别的.

也用http://pythontutor.com/live.html#mode=edit 来看看 。

解决Python 函数声明先后顺序出现的问题

解释到第 8 行的时候在 Global frame 中 foo, bar 都有了,所以能成功调用.

这时候的理解是这样的,Python 从第 1 行自上往下解释到第 7 行的程序入口时,foo() 并未实际调用 bar(),但 foo() 和 bar() 函数都已解释到了,所以回过头来 foo() 与 bar() 之间怎么调用都无妨.

因此,最好的实践方法就是把程序的入口放到代码的最下方,那么它前面的函数不管如何的声明顺序都没有关系.

以上就是解决Python 函数声明先后顺序的问题的详细内容,更多关于python 函数声明顺序的资料请关注我其它相关文章! 。

原文链接:https://yanbin.blog/python-function-declaration-order/ 。

最后此篇关于解决Python 函数声明先后顺序出现的问题的文章就讲到这里了,如果你想了解更多关于解决Python 函数声明先后顺序出现的问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com