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十分建議將每個模組的執行邏輯和輸入輸出都放在程式入口裡面,這樣在調用時不會污染程式上下文執行環境

Tags: