解决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中使用异常处理来判断运行的操作系统平台方法
Jan 22 Python
Python递归函数定义与用法示例
Jun 02 Python
django实现登录时候输入密码错误5次锁定用户十分钟
Nov 05 Python
Python 实现两个列表里元素对应相乘的方法
Nov 14 Python
对Python3 解析html的几种操作方式小结
Feb 16 Python
Python GUI编程完整示例
Apr 04 Python
详解Python匿名函数(lambda函数)
Apr 19 Python
python Event事件、进程池与线程池、协程解析
Oct 25 Python
python中查看.db文件中表格的名字及表格中的字段操作
Jul 07 Python
python操作toml文件的示例代码
Nov 27 Python
python实现双人五子棋(终端版)
Dec 30 Python
Python编程super应用场景及示例解析
Oct 05 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
php 常用算法和时间复杂度
2013/07/01 PHP
ThinkPHP连接数据库及主从数据库的设置教程
2014/08/22 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
JS 有名函数表达式全面解析
2010/03/19 Javascript
扩展jquery实现客户端表格的分页、排序功能代码
2011/03/16 Javascript
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
基于jquery实现弹幕效果
2016/09/29 Javascript
Node.js编写CLI的实例详解
2017/05/17 Javascript
JS实现table表格固定表头且表头随横向滚动而滚动
2017/10/26 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
Angular2整合其他插件的方法
2018/01/20 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
JavaScript递归函数定义与用法实例分析
2019/01/24 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
JS实现放烟花效果
2020/03/10 Javascript
Vue表单提交点击事件只允许点击一次的实例
2020/10/23 Javascript
[03:47]2015国际邀请赛第三日现场精彩回顾
2015/08/08 DOTA
python中import reload __import__的区别详解
2017/10/16 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
安全检查验收制度
2014/01/12 职场文书
《桃花心木》教学反思
2014/02/17 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
大学生毕业个人总结
2015/02/15 职场文书
实施意见格式范本
2015/06/05 职场文书
告知书格式
2015/07/01 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python
Spring Boot 实现敏感词及特殊字符过滤处理
2021/06/29 Java/Android
mysql left join快速转inner join的过程
2021/06/30 MySQL
P站美图推荐——变身女主角特辑
2022/03/20 日漫