Python中的执行顺序和编码风格
我刚开始学Python,所以如果问题太基础,请不要喷我 :)
我听说Python是从上到下执行的。
如果真是这样,为什么程序是这样的呢:
def func2():
pass
def func1():
func2()
def func():
func1()
if __name__ == '__main__':
func()
根据我看到的,主函数是在最后,而其他函数则堆在它的上面。
我这样说错了吗?如果没有,那为什么主函数或者函数定义不都是从上到下写的呢?
补充一下:我想问的是,为什么我不能这样做:
if __name__ == '__main__':
func()
def func1():
func2()
这不是自然的顺序吗?你一直在底部添加东西,因为它是从上到下执行的。
9 个回答
一般来说,Python是从上到下处理命令的。不过,当你调用一个函数时,Python会先执行这个函数,等这个函数执行完了,才会继续往下执行。
在你的例子中,Python解释器执行了以下步骤:
- 定义了
func2
函数。 - 定义了
func1
函数。 - 定义了
func
函数。 - 处理了条件语句
if __name__ == '__main__':
。 - 调用了
func
函数(因为条件成立)。 - 调用了
func1
函数(因为这就是func
要做的事情)。 - 调用了
func2
函数(因为这就是func1
要做的事情)。 - 结束了,因为在完成对
func2
的调用后,也完成了对func1
的调用,因此也完成了对func
的调用,这就是代码中的最后一条语句。
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”都已经被执行过了。
这里的 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