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

时间:2010-09-20 18:21:09

标签: python function formatting

是否可以在未完全定义函数的情况下调用函数?尝试此操作时,我收到错误:“ function_name 未定义”。我来自C ++背景,所以这个问题让我很难过。

在工作之前声明该功能:

def Kerma():
        return "energy / mass"    

print Kerma()

但是,尝试在没有先定义它的情况下调用该函数会给您带来麻烦:

print Kerma()

def Kerma():
    return "energy / mass"

在C ++中,一旦将标题放在它之前,就可以在调用之后声明一个函数。

我在这里错过了什么吗?

5 个答案:

答案 0 :(得分:112)

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

def main():
    print Kerma()

def Kerma():
    return "energy / mass"    

if __name__ == '__main__':
    main()

这允许您按照自己喜欢的顺序为代码编写代码,只要您最后一直调用函数main

答案 1 :(得分:14)

当运行Python模块(.py文件)时,其中的顶级语句按照它们出现的顺序从上到下(从开始到结束)执行。这意味着在您定义之前不能引用某些内容。例如,以下内容将生成显示的错误:

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

与许多其他语言不同,defclass语句在Python中是可执行的 - 而不仅仅是声明性的 - 因此您不能引用ab发生了,他们被定义了。这就是为什么你的第一个例子有问题 - 你在Kerma()语句执行之前引用def函数并且处理了body并且结果函数对象绑定到函数名,所以它没有被定义在剧本的那一点上。

C ++等语言的程序通常在运行之前进行预处理,在此编译阶段,整个程序及其引用的任何#include文件都会被一次性读取和处理。与Python不同,这种语言具有声明性语句,允许在使用前声明(但未定义)函数的名称和调用序列(或静态类型的变量),以便在编译器遇到其名称时,它具有足够的信息来检查它们用法,主要包括类型检查和类型转换,其中没有一个要求它们的实际内容或代码体已经定义。

答案 2 :(得分:8)

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

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

答案 3 :(得分:1)

Python是一种动态语言,解释器总是采用变量(函数,......)的状态,就像调用它们时一样。你甚至可以在一些if-blocks中重新定义函数,并且每次都以不同的方式调用它们。这就是为什么你必须在调用它们之前定义它们。

答案 4 :(得分:1)

如果您愿意像C ++一样使用函数中的所有内容。您可以从文件底部调用第一个函数,如下所示:

def main():
    print("I'm in main")
    #calling a although it is in the bottom
    a()

def b():
   print("I'm in b")

def a():
   print("I'm in a")
   b()

main()

这样,python首先会“读取”整个文件,然后才开始执行