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


Posted in Python onSeptember 02, 2020

在 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,我们来看上面的代码

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

解释到第二行 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 来看看

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

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

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

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

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

Python 相关文章推荐
python实现电子词典
Apr 23 Python
python实现从web抓取文档的方法
Sep 26 Python
python中星号变量的几种特殊用法
Sep 07 Python
python制作websocket服务器实例分享
Nov 20 Python
Python模块文件结构代码详解
Feb 03 Python
python 按照固定长度分割字符串的方法小结
Apr 30 Python
简单的Python调度器Schedule详解
Aug 30 Python
使用Python将字符串转换为格式化的日期时间字符串
Sep 01 Python
Python如何输出警告信息
Jul 30 Python
python 多线程共享全局变量的优劣
Sep 24 Python
Python return语句如何实现结果返回调用
Oct 15 Python
python 使用pandas读取csv文件的方法
Dec 24 Python
解决Python3.8运行tornado项目报NotImplementedError错误
Sep 02 #Python
详解python with 上下文管理器
Sep 02 #Python
Python 的 __str__ 和 __repr__ 方法对比
Sep 02 #Python
Python datetime 如何处理时区信息
Sep 02 #Python
浅析python中的del用法
Sep 02 #Python
浅析NumPy 切片和索引
Sep 02 #Python
详解Python 函数参数的拆解
Sep 02 #Python
You might like
php session 预定义数组
2009/03/16 PHP
php GeoIP的使用教程
2011/03/09 PHP
PHP实现今天是星期几的几种写法
2013/09/26 PHP
php获取新浪微博数据API实例
2013/11/12 PHP
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
php简单分页类实现方法
2015/02/26 PHP
PHP网站建设的流程与步骤分享
2015/09/25 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
2012/10/11 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
javascript+HTML5的Canvas实现Lab单车动画效果
2015/08/07 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
2017/02/09 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
jQuery实现鼠标放置名字上显示详细内容气泡提示框效果的方法分析
2020/04/04 jQuery
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
简化Python的Django框架代码的一些示例
2015/04/20 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
Python3之文件读写操作的实例讲解
2018/01/23 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
django Admin文档生成器使用详解
2019/07/22 Python
关于python3中setup.py小概念解析
2019/08/22 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
业务员岗位职责
2013/11/16 职场文书
十岁生日父母答谢词
2014/01/18 职场文书
电子商务专业自荐信
2014/06/02 职场文书
2014年度工作总结报告
2014/12/15 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
Mysql文件存储图文详解
2021/06/01 MySQL