解决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使用clear方法清除字典内全部数据实例
Jul 11 Python
Python图像灰度变换及图像数组操作
Jan 27 Python
selenium + python 获取table数据的示例讲解
Oct 13 Python
python+flask实现API的方法
Nov 21 Python
对Python3 goto 语句的使用方法详解
Feb 16 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
Python检测数据类型的方法总结
May 20 Python
python输出电脑上所有的串口名的方法
Jul 02 Python
python科学计算之scipy——optimize用法
Nov 25 Python
python 中值滤波,椒盐去噪,图片增强实例
Dec 18 Python
基于Python的EasyGUI学习实践
May 07 Python
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
Jun 29 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实现维护文件代码
2007/06/14 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
php学习笔记之面向对象
2014/11/08 PHP
php使用Session和文件统计在线人数
2015/07/04 PHP
php短信接口代码
2016/05/13 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
PHP实现腾讯短网址生成api接口实例
2020/12/08 PHP
javascript 面向对象继承
2009/11/26 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
JS 日期与时间戮相互转化的简单实例
2016/06/22 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
js根据json数据中的某一个属性来给数据分组的方法
2018/10/08 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
layui 富文本赋值,取值,取纯文本值的实例
2019/09/18 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
使用Python编写爬虫的基本模块及框架使用指南
2016/01/20 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
2020/03/08 Python
Python操作MySQL数据库的示例代码
2020/07/13 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
俄罗斯品牌服装和鞋子在线商店:BRIONITY
2020/03/26 全球购物
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
求职意向书
2014/07/29 职场文书
教代会开幕词
2015/01/28 职场文书
三行辞职书范文
2015/02/26 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
教育教学工作反思
2016/02/24 职场文书
导游词范文之颐和园/重庆/云台山
2019/09/10 职场文书
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python