2010-09-20 136 views
53

在没有完全定义它的情况下调用函数是否可能?当尝试这个时,我得到错误:“function_name未定义”。我来自C++背景,所以这个问题困扰着我。在Python文件末尾声明函数

声明函数作品前:

def Kerma(): 
     return "energy/mass"  

print Kerma() 

但是,试图调用函数不首先确定它给了麻烦:

print Kerma() 

def Kerma(): 
    return "energy/mass" 

在C++中,你可以调用后声明函数一次你把它的标题放在它之前。

我在这里错过了什么吗?

+3

在Python中没有“声明”。有定义(必须完整)或者什么都没有。 – 2010-09-20 18:35:15

+2

你说,“它给了麻烦”。你能详细说明一下吗? – 2010-09-20 18:51:56

+0

[声明在python函数调用后的函数]可能的重复(http://stackoverflow.com/questions/17953219/declaration-functions-in-python-after-call) – user 2016-12-01 16:45:25

回答

93

一种方式是写:

def main(): 
    print Kerma() 

def Kerma(): 
    return "energy/mass"  

if __name__ == '__main__': 
    main() 

这样只要你不断的打电话末尾的功能main你写你自己喜欢的顺序码。

+1

@Muhammad:虽然这是一种可行的方法,但它在Python中确实不是惯用的。恰恰相反,你会注意到大多数'main'函数通常放在最后。 – 2010-09-20 18:28:21

+8

@Eli Bendersky:我会提交'if __name__ =='__main __':'开关是常见的惯用部分。 – 2010-09-20 18:36:03

+2

@Eli:惯用部分是最后的if子句:模块顶层没有代码,然后在模块为__main__的情况下调用main函数。 – 2010-09-20 18:36:24

7

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

对于简单的不必要的脚本,习惯于将“可执行部分”放在最后,或者更好,学会使用交互式Python shell。在Python是那种地道

1

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

11

当运行Python模块(.py文件)时,它的顶层语句按照它们出现的顺序从上到下(从头到尾)执行。这意味着在定义它之前你不能引用某些东西。例如,以下将生成所示的错误:

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

不像许多其他语言,defclass语句在Python —的可执行程序绝不只是声明—所以你不能可以引用在此之前,他们是定义。这就是为什么你的第一个例子遇到问题—在引用Kerma()函数之前,它的def语句已经执行并且正文已经被处理,并且结果函数对象被绑定到函数的名字,所以它没有在脚本中的那个点上定义。

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