解决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入门教程之if语句的用法
May 14 Python
django开发之settings.py中变量的全局引用详解
Mar 29 Python
Python实现的凯撒密码算法示例
Apr 12 Python
使用Python更换外网IP的方法
Jul 09 Python
flask入门之表单的实现
Jul 18 Python
Django 限制用户访问频率的中间件的实现
Aug 23 Python
Python判断字符串是否xx开始或结尾的示例
Aug 08 Python
PyTorch中Tensor的维度变换实现
Aug 18 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 Python
Python实现文本文件拆分写入到多个文本文件的方法
Apr 18 Python
Python Pandas读取Excel日期数据的异常处理方法
Feb 28 Python
Python 绘制多因子柱状图
May 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
tp5(thinkPHP5)框架实现多数据库查询的方法
2019/01/10 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
JQuery 浮动导航栏实现代码
2009/08/27 Javascript
判断控件是否已加载完成的代码
2010/02/24 Javascript
Jquery练习之表单验证实现代码
2010/12/14 Javascript
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
js操作textarea 常用方法总结
2012/12/03 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
2016/09/04 Javascript
AngularJS ng-repeat数组有重复值的解决方法
2016/10/23 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
2017/01/06 Javascript
vue项目中导入swiper插件的方法
2018/01/30 Javascript
vue单页应用加百度统计代码(亲测有效)
2018/01/31 Javascript
详解angular路由高亮之RouterLinkActive
2018/04/28 Javascript
Vue中全局变量的定义和使用
2019/06/05 Javascript
JS面向对象编程实现的拖拽功能案例详解
2020/03/03 Javascript
使用Vue实现一个树组件的示例
2020/11/06 Javascript
python+selenium实现京东自动登录及秒杀功能
2017/11/18 Python
对Python 数组的切片操作详解
2018/07/02 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
2019/01/30 Python
Python 调用 ES、Solr、Phoenix的示例代码
2020/11/23 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
环境工程专业个人求职信
2013/12/05 职场文书
五一劳动节活动记录
2014/03/23 职场文书
高中生班主任评语
2014/04/25 职场文书
力学专业求职信
2014/07/23 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
服务明星事迹材料
2014/12/29 职场文书
裁员通知
2015/04/25 职场文书
超市员工管理制度
2015/08/06 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL
JS代码编译器Monaco使用方法
2021/06/11 Javascript
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers