解决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操作MySQL数据库具体方法
Oct 28 Python
python实现的重启关机程序实例
Aug 21 Python
Python实现TCP/IP协议下的端口转发及重定向示例
Jun 14 Python
Python中str is not callable问题详解及解决办法
Feb 10 Python
python网络编程调用recv函数完整接收数据的三种方法
Mar 31 Python
DataFrame 将某列数据转为数组的方法
Apr 13 Python
Python 经典面试题 21 道【不可错过】
Sep 21 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
Feb 04 Python
python可迭代对象去重实例
May 15 Python
matplotlib.pyplot.plot()参数使用详解
Jul 28 Python
Sentry错误日志监控使用方法解析
Nov 12 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 miniBB中文乱码问题解决方法
2008/11/25 PHP
PHP 文件类型判断代码
2009/03/13 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
PHP把小数转成整数3种方法
2014/06/30 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
JavaScript 序列化对象实现代码
2009/12/18 Javascript
一步一步制作jquery插件Tabs实现过程
2010/07/06 Javascript
javascript 保存文件到本地实现方法
2012/11/29 Javascript
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
JS实现文字放大效果的方法
2015/03/03 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
jQuery实现选项卡切换效果简单演示
2015/12/09 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
小程序根据手机机型设置自定义底部导航距离
2019/06/04 Javascript
python连接MySQL、MongoDB、Redis、memcache等数据库的方法
2013/11/15 Python
python基础教程之popen函数操作其它程序的输入和输出示例
2014/02/10 Python
Python实现全局变量的两个解决方法
2014/07/03 Python
python 调用win32pai 操作cmd的方法
2017/05/28 Python
Python+selenium点击网页上指定坐标的实例
2019/07/05 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
python修改文件内容的3种方法详解
2019/11/15 Python
PageFactory设计模式基于python实现
2020/04/14 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
2014年单位植树节活动方案
2014/03/23 职场文书
事业单位工作人员年度考核个人总结
2015/02/12 职场文书
给病人的慰问信
2015/03/23 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题
Golang 并发下的问题定位及解决方案
2022/03/16 Golang