#範例 1
def a(x,y) :
return x+y
if __name__ == "__main__" :
a(x,y)
程式碼第三行,__name__ == “__main__“到底該怎麼理解 ? 本文將慢慢解析
什麼是name?
__name__是一個內置屬性,當你訪問__name__時,會回覆你當前文件(模組)或者引入的模組名稱。
#範例 2-1
print(__name__)
執行結果
>>> __main__
上面的程式,詢問執行中的文件,名字(__name__)是什麼?程式回傳名稱__main__
python對於自己執行的主程式,會用__main__來自稱。
如果匯入模組,訪問其名字,則會回傳模組名稱。
#範例 2-2
import numpy as np
print (np.__name__)
# >>> numpy
print (np.random.__name__)
# >>> numpy.random
什麼是main?
如上段提到,訪問__name__時,他會回覆你所使用的模組的名稱。
如果直接訪問,會回傳當前程式(主程式)的資訊,但不會用模組名(或說.py檔名、當前程式名稱),而是會用__main__自稱。見範例程式 2-1。
if __name__ == “__main__” 是什麼意思 ?
可以程式使用口語翻譯理解這句話
” 如果 模組名稱 就是 “__main__”的話,…… “
意思是如果執行模組時,他是當作主程式進行的話(而不是被引入的模組),就執行if後的內容。
我們寫的.py檔有時會當主程式運行,有時會被當模組引入。
如果沒這個條件句寫在程式內,在import引入會遇到一些問題,我只是想引入一些def方法而已,但程式會把所有的內容執行完。
範例 3-1是被引入的模組 bar.py,範例 3-2是主要執行的程式 foo.py
#範例 3-1
#被引入的模組 bar.py
def test1():
print ("被引入的模組名稱",__name__)
test1()
print("今天要偷買珍珠奶茶")
#範例 3-2
#主要執行的模組(文件) foo.py
import bar
def test2():
print ("主程式名稱",__name__)
test2()
bar.test1()
執行範例3-2的執行結果
>>> 被引入的模組名稱 bar #在import那行執行了test1(),因為被引入了所以變成 bar
今天要偷買珍珠奶茶 #在import那行,執行了print()
主程式名稱 __main__ #主程式執行test2()
被引入的模組名稱 bar #主程式引入模組bar的test1執行,因為被引入了所以變成 bar
以上範例,討論最後的兩個結果,但因為引入模組有其他零碎的程式碼,所以會被跑出很多我不需要的東西。
那解決的思維就是,bar.py這個檔案
- 當作主程式(當前程式)執行時,才希望有”今天要偷買珍珠奶茶”的字串以及test1()的執行。
- 當作主程式(當前程式)執行時,才希望有”今天要偷買珍珠奶茶”的字串以及test1()的執行。
那該如何實現,這時就要用到 if __name__ == “__main__” ,這個判斷式的口語意思是 判斷當前檔案是否為主程式,主程式的__name__都是”__main__“,如果是引入的話__name__就是檔名。
所以上方程式碼就該修改為下面示範,即能達到效果
#範例 4-1
#被引入的模組 bar.py
def test1():
print ("被引入的模組名稱",__name__)
if __name__ == "__main__" :
test1()
print("今天要偷買珍珠奶茶")
執行結果
>>> 被引入的模組名稱 __main__
今天要偷買珍珠奶茶
引用”愛學習的豆包“的文章圖示與範例,展示模組運行命名流程
狀況1 : 直接執行指令碼
#被引入的模組 bar.py
def test1():
print ("被引入的模組名稱",__name__)
if __name__ == "__main__" :
test1()
print("今天要偷買珍珠奶茶")

狀況2:從其他腳本里匯入
import nameScript as ns
ns.myFunction()

問題回顧
- __name__是什麼 ?
- __main__是什麼?
- 如何理解 if name == “main” :
