#示例代碼基於py3.6
一直對Python程序的執行順序有些疑惑,例如python程序是順序執行的,那怎么還有main函數的出現呢?
在查閱了資料后,參見這里后,算是有點明白了:
1.python程序是順序執行的,而C++中main()是程序的入口
例如以下代碼,結果如注釋所示,這里雖然有個main函數,但是最先輸出的不是“main”而是“test1”:
1 #test1 2 print ("test1") 3 def Fun(): 4 print ("Fun") 5 def main(): 6 print ("main") 7 Fun() 8 if __name__ == '__main__': 9 main() 10 ''' 11 test1 12 main 13 Fun 14 '''
2.一段python程序以py文件運行時,文件屬性__name__為main;作為模塊導入時,文件屬性__name__為文件名:
1 #test.py 2 def Fun(): 3 print ("Fun") 4 if __name__ == '__main__': 5 print ("main") 6 Fun() 7 ''' 8 main 9 Fun 10 '''
3.總結
C++中一main函數為執行的起點;Python中首先執行最先出現的非函數定義和非類定義的沒有縮進的代碼,如示例一之中的第一行
一份程序為了區分主動執行還是被調用,Python引入了變量__name__,當文件是被調用時,__name__的值為模塊名,當文件被執行時,__name__為'__main__'
所以會經常看到別人的代碼這么寫,同時也是典型的python文件結構:
1 #/usr/bin/env/ python #(1) 起始行 2 #"this is a test module" #(2) 模塊文檔(文檔字符串) 3 import sys 4 import os #(3) 模塊導入 5 6 debug = True #(4) (全局)變量定義 7 class FooClass (object): 8 'foo class' 9 pass #(5) 類定義(若有) 10 def main(): 11 'test function' 12 foo = FooClass() 13 if debug: 14 print 'ran test()' #(6) 函數定義(若有) 15 if __name__ == '__main__': 16 main()
若是文件主動執行了,則最好寫成跟上面的例子一樣,main之前不要有可執行代碼,這樣做到程序從main()開始,流程邏輯性強
若是文件作為模塊被調用,則可以不用寫main(),從上而下順序執行。