官术网_书友最值得收藏!

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函數。

主站蜘蛛池模板: 上林县| 东光县| 确山县| 洛阳市| 仁寿县| 凤山县| 剑河县| 金溪县| 丹巴县| 长垣县| 湖南省| 义乌市| 罗城| 赣州市| 比如县| 乾安县| 肥乡县| 巩义市| 红安县| 平潭县| 安阳市| 安图县| 昌图县| 阿合奇县| 四平市| 大埔区| 卓尼县| 娱乐| 通渭县| 什邡市| 抚州市| 新竹市| 博爱县| 平昌县| 蒲城县| 塘沽区| 泰州市| 都江堰市| 铅山县| 眉山市| 白城市|