解决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 相关文章推荐
Python3 入门教程 简单但比较不错
Nov 29 Python
Python实现3行代码解简单的一元一次方程
Aug 18 Python
Python基于二分查找实现求整数平方根的方法
May 12 Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
Jun 02 Python
python中实现k-means聚类算法详解
Nov 11 Python
Python对CSV、Excel、txt、dat文件的处理
Sep 18 Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 Python
python实现网页自动签到功能
Jan 21 Python
Python读取指定日期邮件的实例
Feb 01 Python
用scikit-learn和pandas学习线性回归的方法
Jun 21 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
Mar 25 Python
python实现图片,视频人脸识别(opencv版)
Nov 18 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开发环境配置记录
2011/01/14 PHP
PHP多个版本的分析解释
2011/07/21 PHP
php对数组排序代码分享
2014/02/24 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
javascript hasFocus使用实例
2010/06/29 Javascript
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
JavaScript中值类型和引用类型的区别
2017/02/23 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
Angular6新特性之Angular Material
2018/12/28 Javascript
vue+express+jwt持久化登录的方法
2019/06/14 Javascript
[01:09:20]NB vs NAVI Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
python类定义的讲解
2013/11/01 Python
win10系统中安装scrapy-1.1
2016/07/03 Python
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
为什么Python中没有"a++"这种写法
2018/11/27 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
Python实现个人微信号自动监控告警的示例
2019/07/03 Python
慕尼黑山地运动、户外服装和体育用品专家:Sporthaus Schuster
2019/08/27 全球购物
波兰汽车配件网上商店:iParts.pl
2020/09/08 全球购物
毕业生求职的求职信
2013/12/05 职场文书
社区国庆节活动方案
2014/02/05 职场文书
《小蝌蚪找妈妈》教学反思
2014/02/21 职场文书
防火标语大全
2014/10/06 职场文书
弘扬焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
追悼会答谢词
2015/01/05 职场文书
2015年财务部工作总结
2015/04/10 职场文书