解决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处理PHP数组文本文件实例
Sep 18 Python
Python单体模式的几种常见实现方法详解
Jul 28 Python
pip安装Python库时遇到的问题及解决方法
Nov 23 Python
python实现发送邮件功能代码
Dec 14 Python
Win下PyInstaller 安装和使用教程
Dec 25 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 Python
基于python检查矩阵计算结果
May 21 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
python3跳出一个循环的实例操作
Aug 18 Python
使用Python绘制台风轨迹图的示例代码
Sep 21 Python
Python字节单位转换(将字节转换为K M G T)
Mar 02 Python
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
Nov 11 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中字符串与多进制转换函数的实例代码
2016/11/03 PHP
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
Javascript 键盘keyCode键码值表
2009/12/24 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
2014/01/06 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
Javascript的严格模式strict mode详细介绍
2014/06/06 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
vue+django实现一对一聊天功能的实例代码
2019/07/17 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
JS数组Reduce方法功能与用法实例详解
2020/04/29 Javascript
js简单实现自动生成表格功能示例
2020/06/02 Javascript
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
常用python数据类型转换函数总结
2014/03/11 Python
Python抓取京东图书评论数据
2014/08/31 Python
Python实现计算文件夹下.h和.cpp文件的总行数
2015/04/23 Python
python中map()与zip()操作方法
2016/02/27 Python
用Python实现随机森林算法的示例
2017/08/24 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
python rolling regression. 使用 Python 实现滚动回归操作
2020/06/08 Python
Html5新增标签有哪些
2017/04/13 HTML / CSS
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
软件测试工程师笔试题带答案
2015/03/27 面试题
小学生环保倡议书
2014/05/15 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书
三十年同学聚会致辞
2015/07/28 职场文书
Nginx解决前端访问资源跨域问题的方法详解
2021/03/31 Servers
Python中os模块的简单使用及重命名操作
2021/04/17 Python
原生JS中应该禁止出现的写法
2021/05/05 Javascript