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

 更新时间:2020年09月02日 11:49:09   作者:Yanbin  
这篇文章主要介绍了如何解决Python 函数声明先后顺序的问题,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下

在 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 中函数声明的顺序据我理解有两条规则

  • 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 函数声明顺序的资料请关注脚本之家其它相关文章!

相关文章

  • python四个坐标点对图片区域最小外接矩形进行裁剪

    python四个坐标点对图片区域最小外接矩形进行裁剪

    在图像裁剪操作中,opencv和pillow两个库都具有相应的函数,如果想要对目标的最小外接矩形进行裁剪该如何操作呢?本文就来详细的介绍一下
    2021-06-06
  • Python+random模块实现随机抽样

    Python+random模块实现随机抽样

    python的random库,提供了很多随机抽样方法。本文将通过几个示例为大家详细讲讲random模块实现随机抽样的方法,需要的可以参考一下
    2022-09-09
  • python数据处理详情

    python数据处理详情

    这篇文章主要介绍了python数据处理详情,文章通过json文件的一个数据表展开对主题的详细说明,具有一定的参考价值需要的小伙伴可以参考一下
    2022-04-04
  • django如何部署到centos服务器上

    django如何部署到centos服务器上

    django项目写完以后最好能部署到服务器上,这样就可以在随时随地查看内容了,本文主要介绍了django如何部署到centos服务器上,感兴趣的可以了解一下
    2023-08-08
  • Pytorch中view函数实例讲解

    Pytorch中view函数实例讲解

    这篇文章主要给大家介绍了关于Pytorch中view函数的相关资料,PyTorch中的.view()函数是一个用于改变张量形状的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • np.array()函数的使用方法

    np.array()函数的使用方法

    本文主要介绍了np.array()函数的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Python 动态绑定属性和方法 

    Python 动态绑定属性和方法 

    这篇文章主要介绍了Python 动态绑定属性和方法, 动态语言与静态语言有很多不同,最大的特性之一就是可以实现动态的对类和实例进行修改,在Python中,我们创建了一个类后可以对实例和类绑定心的方法或者属性,实现动态绑定,下面详细介绍需要的朋友可以参考一下
    2022-03-03
  • 解决pyqt5异常退出无提示信息的问题

    解决pyqt5异常退出无提示信息的问题

    这篇文章主要介绍了解决pyqt5异常退出无提示信息的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python常用库大全及简要说明

    Python常用库大全及简要说明

    本文为大家罗列了Python开发的常用库和各个库的简要说明以及Python开发工具,包管理,环境管理等其它常用资源和Python学习资料
    2020-01-01
  • 基于Python编写简易文字语音转换器

    基于Python编写简易文字语音转换器

    这篇文章主要为大家介绍了如何利用Python编写一个简易文字语音转换器,并打包成exe。文中的示例代码讲解详细,感兴趣的小伙伴快跟随小编一起尝试一下
    2022-03-03

最新评论