if __name__ == ‘__main__’到底是什麼?
引子
要搞清楚這個問題,可以先聽一個故事~~~
像我們做事一樣,都需要一個起始點,終點存在與否無關緊要。編程也是一樣,任何程式都有一個入口,在所謂的靜態編譯語言中,如Java
的入口是一個名字叫做Main
的類,所有的程式都必須從這裡開始運行,因此讀別人的Java
程式碼很方便,直接找入口就可以了。而Python
這種動態解釋型的語言不一樣,他的入口就是程式的第一行,從程式碼開始書寫的地方一直讀到程式末尾,這就很有意思了,為了讓程式設計師讀別人的程式碼更方便,也為了讓程式輸出更為簡潔,約定俗成了一種規範,即模仿Java
,使用if __name__ == '__main__'
給程式設定一個入口。
if __name__ == '__main__'
是為了使Python
更優雅而約定俗成的一個程式入口。
但是,這個程式入口和Java
略有不同:
Java
強製程式所有的輸入輸出、流程式控制制等都在Main
類裡面;Python
只是使用if __name__ == '__main__'
保證不是同一個模組的輸入輸出、流程式控制制等不相互影響。
分步驟詳細舉例說明
什麼是
__name__
?
新建一個Python程式,a.py
# a.py
print('a.py':__name__)
輸出:
a.py:__main__
再新建一個Python程式,b.py
# b.py
import a
# 當前程式包的名字
print('b.py':__name__)
# b.py程式的名字
print('a.py':a.__name__)
運行b.py
,輸出:
b.py:__main__
a.py:a
小結
__name__
是程式的名稱,當前運行程式的__name__
是__main__
,非當前運行程式的名稱為程式的模組名稱,即自定義值。
如果程式裡面含有程式入口,那麼程式如何執行呢?
即Python
只是使用if __name__ == '__main__'
保證不是同一個模組的輸入輸出、流程式控制制等不相互影響。如何解釋呢?
# a.py
print('01:首先執行這一行程式碼')
if __name__ == '__main__':
print('02:然後執行這一行程式碼')
運行a.py
,輸出:
01:首先執行這一行程式碼
02:然後執行這一行程式碼
以上說明,python
是順序執行的,這個所謂的程式入口並不能改變執行順序。
如果程式長這樣呢?
# a.py
print('a-01:這是a程式的輸出')
--------------------------
# b.py
import a
if __name__ == '__main__':
print('b-01:這是b程式的輸出')
運行b.py
,輸出:
a-01:這是a程式的輸出
b-01:這是b程式的輸出
可見,又一次證明程式是順序執行的,而且程式入口並沒有起作用。
那麼,這個程式入口的作用是什麼呢?
# a.py
if __name__ == '__main__':
print('a-01:這是a程式的輸出')
--------------------------
# b.py
import a
if __name__ == '__main__':
print('b-01:這是b程式的輸出')
運行b.py
,輸出:
b-01:這是b程式的輸出
這次成功阻止了a.py
程式的輸出,可以輕鬆理解:Python
只是使用if __name__ == '__main__'
保證不是同一個模組的輸入輸出、流程式控制制等不相互影響。
小結
為了更簡潔優雅的使用
Pyhton
十分建議將每個模組的執行邏輯和輸入輸出都放在程式入口裡面,這樣在調用時不會污染程式上下文執行環境。