解决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实现短网址和数字相互转换的方法
Apr 28 Python
举例讲解Python中字典的合并值相加与异或对比
Jun 04 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
Apr 05 Python
Python 利用pydub库操作音频文件的方法
Jan 09 Python
一个可以套路别人的python小程序实例代码
Apr 09 Python
Python中的单下划线和双下划线使用场景详解
Sep 09 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
python 中值滤波,椒盐去噪,图片增强实例
Dec 18 Python
Django admin 实现search_fields精确查询实例
Mar 30 Python
python实现学生管理系统开发
Jul 24 Python
python+flask编写一个简单的登录接口
Nov 13 Python
基于Python实现射击小游戏的制作
Apr 06 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_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
2014/01/17 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
JavaScript 加号(+)运算符号
2009/12/06 Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
JavaScript 盒模型 尺寸深入理解
2012/12/31 Javascript
js 获取元素下面所有li的两种方法
2014/04/14 Javascript
js获取字符串最后一位方法汇总
2014/11/13 Javascript
原生javascript实现图片按钮切换
2015/01/12 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
p5.js绘制旋转的正方形
2019/10/23 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
从请求到响应过程中django都做了哪些处理
2018/08/01 Python
python通过zabbix api获取主机
2018/09/17 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
如何安装并在pycharm使用selenium的方法
2020/04/30 Python
爱淘宝:淘宝网购物分享平台
2017/04/28 全球购物
英国首屈一指的票务公司:See Tickets
2019/05/11 全球购物
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
软件测试题目
2013/02/27 面试题
酒吧副总经理岗位职责
2013/12/10 职场文书
《金钱的魔力》教学反思
2014/02/24 职场文书
我的小天地教学反思
2014/04/30 职场文书
先进党支部申报材料
2014/12/24 职场文书
2015年银行柜员工作总结报告
2015/04/01 职场文书
MySQL开启事务的方式
2021/06/26 MySQL
基于python定位棋子位置及识别棋子颜色
2021/07/26 Python