- Python數據分析入門:從數據獲取到可視化
- 沈祥壯
- 909字
- 2019-10-21 12:09:17
1.2.1 if__name__=='__main__'
相信讀者在學習Python基礎語法的時候,在程序最后經常會遇到這句話,這里簡單解釋下它的意義。總地來說,這句代碼的作用是既能保證當前的.py文件直接運行,也能保證其可以作為模塊被其他.py文件導入。下面通過幾個例子幫助讀者加深理解。
首先,創(chuàng)建一個.py文件,設置文件名,這里為Hello.py。編輯文件,運行下面這句代碼。
print(__name__)
其輸出如下。
__main__
這說明,__name__本身是一個變量,但它不是一般的變量。實際上,它是在程序執(zhí)行前就創(chuàng)建并賦值的,而賦值的機制是這里的關鍵。在當前程序被當作主程序被執(zhí)行的時候,__name__自動被賦值為固定的字符串__main__;當它作為模塊被其他文件調用的時候,自動被賦值為模塊所在的文件名。
基于上述對__name__的理解,新建name_main.py文件,寫入下面這段代碼。
def printHello(): print("Hello World! ") print(__name__) if __name__ == '__main__': printHello()
其輸出如下。
Hello World! __main__
因為name_main.py文件是作為主程序來運行的,所以__name__此處被賦值為__main__。此時程序的邏輯很清楚:定義一個函數,然后判斷語句,最后判斷后通過執(zhí)行函數。
細心的讀者可能已經發(fā)現,即使不要判斷語句,程序一樣可以運行。例如使用以下代碼,程序還是可以正常運行的。
def printHello(): print("Hello World! ") print(__name__) printHello()
可見這句代碼的作用是,既能保證當前的.py文件直接運行,也能保證其可以作為模塊被其他.py文件導入。所以它也可以在當前文件被當作一個模塊調入的時候發(fā)揮關鍵的作用。
假設name_main.py就用這種不帶if判斷語句的寫法,新建name_main1.py,按照如下的方式將name_main.py作為模塊調入。
from name_main import printHello printHello()
運行name_main1.py文件,想想看,輸出會是什么?可能會和大家想的有些出入。
Hello World! name_main Hello World! name_main
首先,可以看到name_main.py在被作為模塊調入的時候,對應的__name__被賦值為對應的文件名,這一點是在意料之中的。雖然只運行了name_main1.py文件,但是可以明顯看到函數被執(zhí)行了兩次,這就是關鍵所在。這是因為,不帶if判斷語句的name_main.py文件在作為模塊被引入時,printHello函數已經自動執(zhí)行了一次,之后在name_main1.py被主動調用時執(zhí)行了一次,一共執(zhí)行兩次。
那么,此句代碼的作用已經十分清楚了,它保證模塊文件的函數既能在模塊文件單獨執(zhí)行,又能保證它被其他.py文件調入時,相應的函數不被重復執(zhí)行。
回到本例,編輯name_main.py,如下所示。
def printHello(): print("Hello World! ") print(__name__) if __name__ == '__main_ _': printHello()
運行輸出如下。
Hello World! __main__
編輯name_main1.py,如下所示。
from name_main import printHello printHello()
運行輸出如下。
Hello World! name_main
這樣既能單獨運行name_main.py進行printHello函數的調試等操作,也能保證name_main1.py可以正常使用printHello函數。