Python中的执行顺序和编码风格

34 投票
9 回答
48754 浏览
提问于 2025-04-15 23:37

我刚开始学Python,所以如果问题太基础,请不要喷我 :)

我听说Python是从上到下执行的。

如果真是这样,为什么程序是这样的呢:

def func2(): 
    pass

def func1():
    func2()

def func():
    func1()

if __name__ == '__main__':
    func()

根据我看到的,主函数是在最后,而其他函数则堆在它的上面。

我这样说错了吗?如果没有,那为什么主函数或者函数定义不都是从上到下写的呢?

补充一下:我想问的是,为什么我不能这样做:

if __name__ == '__main__':
    func()

def func1():
    func2()

这不是自然的顺序吗?你一直在底部添加东西,因为它是从上到下执行的。

9 个回答

5

一般来说,Python是从上到下处理命令的。不过,当你调用一个函数时,Python会先执行这个函数,等这个函数执行完了,才会继续往下执行。

在你的例子中,Python解释器执行了以下步骤:

  1. 定义了 func2 函数。
  2. 定义了 func1 函数。
  3. 定义了 func 函数。
  4. 处理了条件语句 if __name__ == '__main__':
  5. 调用了 func 函数(因为条件成立)。
  6. 调用了 func1 函数(因为这就是 func 要做的事情)。
  7. 调用了 func2 函数(因为这就是 func1 要做的事情)。
  8. 结束了,因为在完成对 func2 的调用后,也完成了对 func1 的调用,因此也完成了对 func 的调用,这就是代码中的最后一条语句。
27

Python的代码是从上到下执行的,但当你写一个“def”块时,它里面的代码并不会立刻执行。相反,它会在当前的作用域中创建一个函数对象,并给它一个名字。想象一下你有一个Python文件,类似于你的例子:

def func2():
    print "func2"

def func1():
    func2()

def func():
    func1()

if __name__ == '__main__':
    func()

当这个脚本被执行时,会发生以下事情:

首先,会创建一个函数对象,并把它绑定到全局作用域中的名字“func2”。接着,又会创建一个函数对象,绑定到名字“func1”。然后是一个叫“func”的函数。接下来,执行“if”语句,条件为真,所以执行“func()”语句。此时,“func”是一个在全局作用域中找到的函数对象,所以它被调用,里面的代码就开始运行。这个代码里有“func1()”的语句,这个语句会被解析为对“func1”函数的调用,依此类推。

如果你把“if”语句放在最上面,当它执行时,名字“func”还没有被定义,这样就会出现错误。重要的是要明白,“def”语句本身也是一个会被执行的语句。它和其他一些语言不同,在那些语言里,定义是单独的声明,不会有执行顺序。

另外要注意,只要“if __name__...”这一部分在文件的最后,其他声明的顺序其实并不重要,因为在调用它们之前,所有的“def”都已经被执行过了。

38

这里的 def 是在创建函数。除了解析语法和把函数和名字关联起来,其他的代码并不会被执行。

if 是代码真正开始执行的地方。如果你把它放在最前面,然后在定义之前就调用一个函数,就会出现一个叫做 NameError 的错误。因此,你需要把它放在函数定义之后。

要注意,这和 PHP 或 JavaScript 不一样。在 PHP 和 JavaScript 中,函数会被“提升”,也就是说,所有的函数定义会在其他代码之前被处理和解析。在这两种语言中,像你说的那样,在调用函数的地方下面定义函数是完全合法的。(在 JavaScript 中有一个细节是,像 function(){} 这样定义的函数会被提升,而像 var func1=function(){}; 这样定义的函数则不会。我还不知道 PHP 5.3 中匿名函数是怎么处理的)。

举个例子,cat() 会正常打印,而 yip() 会出现 NameError,因为在你调用它的时候,解析器还没有到 yip() 的定义那里。

def cat():
  print 'meowin, yo'

cat()

yip()

def yip():
  print 'barkin, yall'

meowin, yo
Traceback (most recent call last):
File "cat.py", line 5, in
yip()
NameError: name 'yip' is not defined

撰写回答