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

The*_*One 72 python formatting function

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

在工作之前声明功能:

def Kerma():
        return "energy / mass"    

print Kerma()
Run Code Online (Sandbox Code Playgroud)

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

print Kerma()

def Kerma():
    return "energy / mass"
Run Code Online (Sandbox Code Playgroud)

在C++中,一旦在其前面放置标题,就可以在调用后声明一个函数.

我在这里错过了什么吗?

Muh*_*uri 120

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

def main():
    print Kerma()

def Kerma():
    return "energy / mass"    

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

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

  • @Eli Bendersky:我认为`if __name__ =='__ main __':`switch是常见的惯用语. (12认同)
  • @Muhammad:虽然这是一种可行的方法,但它在Python中肯定不是惯用语.恰恰相反,你会发现大多数`main`函数通常放在最后. (3认同)
  • @Eli:惯用部分是最后的if子句:模块顶层没有代码,如果模块是__main__,则最后调用main函数. (2认同)
  • 使用 if __name__ == '__main__': switch 它与您如何订购函数无关。这是正确的事(TM)。 (2认同)

mar*_*eau 15

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

c = a + b  # -> NameError: name 'a' is not defined
a = 13
b = 17
Run Code Online (Sandbox Code Playgroud)

不像许多其他语言,def以及class语句是可执行的Python中,不只是声明,所以你不能可以引用ab在此之前,他们正在定义.这就是为什么你的第一个例子有问题 - 在你的语句执行Kerma()之前引用该函数def并且处理了body并且结果函数对象绑定到函数的名称,所以它没有在脚本中的那个点定义.

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


Eli*_*sky 10

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

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


ary*_*rye 10

如果您愿意像 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()
Run Code Online (Sandbox Code Playgroud)

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


eum*_*iro 6

Python 是一种动态编程语言,解释器始终采用变量(函数等)在调用它们时的状态。您甚至可以重新定义某些 if 块中的函数,并每次以不同的方式调用它们。这就是为什么你必须在调用它们之前定义它们。