在Python文件的末尾声明函数


94

是否可以在不首先完全定义函数的情况下调用函数?尝试执行此操作时,出现错误:“未定义function_name ”。我来自C ++背景,因此这个问题令我感到难过。

在工作之前声明该功能:

def Kerma():
        return "energy / mass"    

print Kerma()

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

print Kerma()

def Kerma():
    return "energy / mass"

在C ++中,一旦将其标头放在函数后,就可以在调用后声明一个函数。

我在这里想念什么吗?


5
在Python中没有“声明”。有定义(必须完整),否则就什么也没有。
S.Lott

2
您说,“这会带来麻烦”。您能详细说明一下吗?
Martin Del Vecchio


如果你想知道:Kerma is an acronym for "kinetic energy released per unit mass"
匿名

1
我知道这已经很老了,但是为什么没有人建议将这些功能放在一个单独的.py文件中并导入呢?有一些意想不到的后果吗?
凯尔(Kyle)

Answers:


145

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

def main():
    print Kerma()

def Kerma():
    return "energy / mass"    

if __name__ == '__main__':
    main()

只要您最后一直调用该函数main,就可以按照自己喜欢的顺序编写代码。


4
@Muhammad:虽然这是一种可行的方法,但是它在Python中肯定不是惯用的。相反,您会发现大多数main功能通常放在最后。
伊莱·班德斯基

14
@Eli Bendersky:我认为if __name__ == '__main__':开关是常见的惯用语。
S.Lott

2
@Eli:惯用的部分是if子句的末尾:模块顶层没有代码,如果模块是main,则末尾调用main函数。
Ned Batchelder

1
@Eli:惯用的部分是if ... __main__':。我没有说main应该将其放在其余代码的上方。我说过最重要的部分是_\_main__在结尾处调用,然后在何处放置其定义都无关紧要。
Muhammad Alkarouri

2
如果if name ==' main ':开关,则与如何订购函数无关。这是正确的事情。
MKesper '16

18

当运行Python模块(.py文件)时,模块中的顶层语句按照从上到下(从头到尾)的显示顺序执行。这意味着您必须先定义它,然后才能引用它。例如,以下将生成显示的错误:

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

不像许多其他语言,def以及class语句是可执行的Python中,不只是声明,所以你不能可以引用ab在此之前,他们正在定义。这就是第一个示例遇到麻烦的原因-您在Kerma()函数的def语句已执行且主体已被处理之前将函数引用,并且将生成的函数对象绑定到函数的名称,因此该脚本在那时尚未定义。

像C ++这样的语言的程序通常在运行之前经过预处理,在此编译阶段,整个程序及其#include引用的任何文件都会立即读取和处理。与Python不同,该语言具有声明性语句,该声明性语句允许在使用前声明(但未定义)函数的名称和调用顺序(或未定义的静态类型),以便在编译器遇到其名称时有足够的信息来检查其名称。用法,主要需要类型检查和类型转换,而这些都不需要定义其实际内容或代码体。


并不是说动态语言不能做到这一点。Perl是一种动态语言,可以在定义它之前调用一个函数。那是因为它有一个编译阶段和一个执行阶段(虽然奇怪,但有用的是,您可以安排在编译阶段执行代码)。这有效: doit(); sub doit { print("I'm doing it!\n"); }
John Deighan '19

9

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

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


1

Python是一种动态语言,解释器在调用变量时始终像对待变量一样调用它们的状态。您甚至可以在某些if块中重新定义函数,并以不同的方式调用它们。这就是为什么在调用它们之前必须定义它们的原因。


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首先“读取”整个文件,然后才开始执行

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.