解决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实现的检测网站挂马程序
Nov 30 Python
列举Python中吸引人的一些特性
Apr 09 Python
Python中的Descriptor描述符学习教程
Jun 02 Python
pytorch对可变长度序列的处理方法详解
Dec 08 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
Mar 30 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
python/golang 删除链表中的元素
Sep 14 Python
python 高阶函数简单介绍
Feb 19 Python
python基础之文件处理知识总结
May 23 Python
Python Pandas模块实现数据的统计分析的方法
Jun 24 Python
Python 正则模块详情
Nov 02 Python
baselines示例程序train_cartpole.py的ImportError
May 20 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
PHP4(windows版本)中的COM函数
2006/10/09 PHP
建立动态的WML站点(二)
2006/10/09 PHP
PHP防CC攻击实现代码
2011/12/29 PHP
PHP数据流应用的一个简单实例
2012/09/14 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
Laravel实现用户注册和登录
2015/01/23 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
JavaScript 无符号右移运算符
2009/04/17 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
JQuery实现展开关闭层的方法
2015/02/17 Javascript
jQuery控制网页打印指定区域的方法
2015/04/07 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
Layui 带多选框表格监听事件以及按钮自动点击写法实例
2019/09/02 Javascript
react-intl实现React国际化多语言的方法
2020/09/27 Javascript
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
python机器学习实战之K均值聚类
2017/12/20 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
2019/06/14 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
Python+OpenCV图像处理——实现直线检测
2020/10/23 Python
HashMap和Hashtable的区别
2013/05/18 面试题
三维科技面试题
2013/07/27 面试题
异地年检委托书范本
2014/09/24 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
合同补充协议书
2016/03/24 职场文书
SQLServer2019 数据库的基本使用之图形化界面操作的实现
2021/04/08 SQL Server
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技