是否可以在未完全定义函数的情况下调用函数?尝试此操作时,我收到错误:“ function_name 未定义”。我来自C ++背景,所以这个问题让我很难过。
在工作之前声明该功能:
def Kerma():
return "energy / mass"
print Kerma()
但是,尝试在没有先定义它的情况下调用该函数会给您带来麻烦:
print Kerma()
def Kerma():
return "energy / mass"
在C ++中,一旦将标题放在它之前,就可以在调用之后声明一个函数。
我在这里错过了什么吗?
答案 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
与许多其他语言不同,def
和class
语句在Python中是可执行的 - 而不仅仅是声明性的 - 因此您不能引用a
或b
发生了,他们被定义了。这就是为什么你的第一个例子有问题 - 你在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首先会“读取”整个文件,然后才开始执行