在 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,我们来看上面的代码
解释到第二行 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 来看看
解释到第 8 行的时候在 Global frame 中 foo, bar 都有了,所以能成功调用。
这时候的理解是这样的,Python 从第 1 行自上往下解释到第 7 行的程序入口时,foo() 并未实际调用 bar(),但 foo() 和 bar() 函数都已解释到了,所以回过头来 foo() 与 bar() 之间怎么调用都无妨。
因此,最好的实践方法就是把程序的入口放到代码的最下方,那么它前面的函数不管如何的声明顺序都没有关系。
以上就是解决Python 函数声明先后顺序的问题的详细内容,更多关于python 函数声明顺序的资料请关注其它相关文章!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 群星《前途海量 电影原声专辑》[FLAC/分轨][227.78MB]
- 张信哲.1992-知道新曲与精丫巨石】【WAV+CUE】
- 王翠玲.1995-ANGEL【新艺宝】【WAV+CUE】
- 景冈山.1996-我的眼里只有你【大地唱片】【WAV+CUE】
- 群星《八戒 电影原声带》[320K/MP3][188.97MB]
- 群星《我的阿勒泰 影视原声带》[320K/MP3][139.47MB]
- 纪钧瀚《胎教古典音乐 钢琴与大提琴的沉浸时光》[320K/MP3][148.91MB]
- 刘雅丽.2001-丽花皇后·EMI精选王【EMI百代】【FLAC分轨】
- 齐秦.1994-黄金十年1981-1990CHINA.TOUR.LIVE精丫上华】【WAV+CUE】
- 群星.2008-本色·百代音乐人创作专辑【EMI百代】【WAV+CUE】
- 群星.2001-同步过冬AVCD【环球】【WAV+CUE】
- 群星.2020-同步过冬2020冀待晴空【环球】【WAV+CUE】
- 沈雁.1986-四季(2012梦田复刻版)【白云唱片】【WAV+CUE】
- 纪钧瀚《胎教古典音乐 钢琴与大提琴的沉浸时光》[FLAC/分轨][257.88MB]
- 《国语老歌 怀旧篇 3CD》[WAV/分轨][1.6GB]