Python教程-顺序执行

顺序执行
虽然我们有各种流程判断、循环、跳转、控制、中断等等,但从根本上程序还是逐行顺序执行的。
Python代码在执行过程中,遵循下面的基本原则:
- 普通语句,直接执行;
- 碰到函数,将函数体载入内存,并不直接执行;
- 碰到类,执行类内部的普通语句,但是类的方法只载入,不执行;
- 碰到if、for等控制语句,按相应控制流程执行;
- 碰到@、break、continue等,按规定语法执行;
- 碰到函数、方法调用等,转而执行函数内部代码,执行完毕继续执行原有顺序代码。
if name == main
很多时候,我们在Python程序中经常看到这样一行语句,下面简要解释一下它的含义:
首先,__name__
是所有模块都会有的一个内置属性,一个模块的__name__
值取决于你如何调用模块。假如你有一个test.py
文件,在另一个文件中使用import test.py
导入这个模块,那么test.py
模块的__name__
属性的值就是test
,不带路径或者文件扩展名。但是很多时候,模块或者说脚本会像一个标准的程序样直接运行,也就是类似python test.py
这种方式,在这种情况下,__name__
的值将是一个特殊的缺省值"__main__"
。
根据上面的特性,我们可以使用if __name__ == '__main__'
来判断是否是直接运行该.py文件!如果是,那么if
代码块下的语句就会被执行,如果不是,就不执行。这种方法常用于对模块进行测试和调试,区分直接运行和被导入两种情况的不同执行方式。
让我们通过下面的例子来演示,脚本名为test.py
,执行python test.py
,观察实际的顺序执行方式:
import os # 1
print('<[1]> time module start') # 2
class ClassOne():
print('<[2]> ClassOne body') # 3
def __init__(self): # 10
print('<[3]> ClassOne.__init__')
def __del__(self):
print('<[4]> ClassOne.__del__') # 101
def method_x(self): # 12
print('<[5]> ClassOne.method_x')
class ClassTwo(object):
print('<[6]> ClassTwo body') # 4
class ClassThree():
print('<[7]> ClassThree body') # 5
def method_y(self): # 16
print('<[8]> ClassThree.method_y')
class ClassFour(ClassThree):
print('<[9]> ClassFour body') # 6
def func():
print("<func> function func")
if __name__ == '__main__': # 7
print('<[11]> ClassOne tests', 30 * '.') # 8
one = ClassOne() # 9
one.method_x() # 11
print('<[12]> ClassThree tests', 30 * '.') # 13
three = ClassThree() # 14
three.method_y() # 15
print('<[13]> ClassFour tests', 30 * '.') # 17
four = ClassFour()
four.method_y()
print('<[14]> evaltime module end') # 100
- 首先执行#1的import语句。
- 执行#2的打印语句。
- ClassOne、ClassThree和ClassFour的类定义执行过程中,分别打印#3、#4、#5、#6四句话,但是其中的方法并不执行,仅仅是载入内存。
- 碰到#7的
if __name__ == '__main__':
,判断为True,于是执行if内部的代码。 - 执行#8的打印语句。
- 执行#9,实例化一个ClassOne的对象。
- 执行#10的初始化方法,打印一条语句。
- 转到#11处调用method_x方法。
- 转到类的定义体,找到#12,执行该方法,打印语句。
- 返回到#13处,打印语句。
- 执行#14的实例化。
- ClassThree没有自定义初始化方法,接着执行#15。
- 回到类内部,找到#16的方法,执行打印语句。
- 执行#17。
- ......后面的步骤不再详述。
- 执行完最后的#100的打印语句后,按理说程序应该终止退出了,但由于ClassOne这个类定义了
__del__
方法,还要在最后执行它内部的代码#101这条打印语句。
通过这个例子,相信你对Python的程序执行流程能够有一定的了解。实际上,这个过程也是我们阅读别人代码的过程。