在Python中声明文件末尾的函数

没有完全定义它,是否可以调用一个函数? 当尝试这个时,我得到错误:“ function_name未定义”。 我来自C ++的背景,所以这个问题困扰着我。

在作品之前声明该function:

def Kerma(): return "energy / mass" print Kerma() 

但是,试图调用该函数而没有先定义它会带来麻烦:

 print Kerma() def Kerma(): return "energy / mass" 

在C ++中,你可以在调用之后声明一个函数。

我在这里错过了什么?

在Python中有一种惯用的方式是写:

 def main(): print Kerma() def Kerma(): return "energy / mass" if __name__ == '__main__': main() 

这允许您按照自己喜欢的顺序编写代码,只要在最后调用main函数即可。

当一个Python模块(.py文件)运行时,它的顶层语句按照它们出现的顺序从上到下(从头到尾)执行。 这意味着在定义它之前你不能引用它。 例如,下面的代码会显示错误:

 c = a + b # -> NameError: name 'a' is not defined a = 13 b = 17 

与许多其他语言不同, defclass语句在Python中是可执行的,而不仅仅是声明式的,所以你不能直接引用它们并且定义它们。 这就是为什么你的第一个例子有麻烦 – 你的def语句执行前已经处理了正文并且已经处理了正文,并且结果函数对象被绑定到了函数的名字,所以在脚本中没有定义它。

像C ++这样的语言程序通常在运行之前进行预处理,在编译阶段,整个程序和它引用的所有#include文件都被一次读取和处理。 与Python不同的是,这种语言具有声明性语句,它允许在使用之前声明(但不定义)函数的名称和调用顺序(但不是定义的),以便当编译器遇到它们的名字时,它有足够的信息来检查它们使用,主要是需要进行types检查和types转换,这些都不需要实际的内容或代码体定义。

这在Python中是不可能的,但坦率地说,你很快就会发现你根本不需要它。 Pythonic编写代码的方法是将程序划分为定义类和函数的模块,以及导入所有其他模块并运行的单个“主模块”。

对于简单的丢弃脚本,习惯于将“可执行部分”放在最后,或者更好的学习使用交互式Python shell。

Python是一种dynamic的语言,解释者总是在调用variables(函数,…)的时刻处于状态。 你甚至可以在一些if块中重新定义函数,每次都调用它们。 这就是为什么你必须在调用它们之前定义它们。