使用 Python 的人,平常常常會寫一些腳本,不管是為了提升工作效率,還是為了滿足一些特定的需求,Python 腳本都是一個常見又有用的東西。
但是,我最近發現了一個以前不曾察覺的問題,就是腳本裡面是否添加if __name__ == "__main__":
這個語句,對腳本的使用其實是有很大影響的,而且這裡面還有很大的學問。
很多朋友在寫腳本時比較隨意,簡單的腳本直接一溜寫下來,沒有函數,順序執行。複雜點的腳本,可能會加函數。這種寫法可讀性比較差,常常讓人一眼找不到程式運行的入口和順序。
而Python 社群比較推薦的寫法是在寫腳本時,加上下面這個語句:
def main(): # do something print("do something.") if __name__ == "__main__": main()
大多數人看到這裡,會不會說,這有什麼,加不加這個沒那麼重要吧!
先不要忙著不屑,讓我們一起來仔細掰扯掰扯!
在具體說明if __name__ = = '__main__' 的作用前,先從一個簡單的實例直觀上感受一下。
# const.py PI = 3.14 def train(): print("PI:", PI) train()
# area.py from const import PI def calc_round_area(radius): return PI * (radius ** 2) def calculate(): print("round area: ", calc_round_area(2)) calculate()
我們看下area.py 的運行結果:
PI: 3.14 round area:12.56
的PI 變量,在運行的時候,const.py 中函數train()
中的打印也帶過來了,而我們只是引用變量,並沒有引用函數,所以這是我們不願意看到的。
解決這個問題的方法也很簡單,我們只要在const.py 中加上一句:
PI = 3.14 def train(): print("PI:", PI) if __name__ == "__main__": train()
再次執行area.py ,輸出結果如下:
round area:12.56
這是我們預期的結果。
叢上述實例可以發現,如果沒有if __name__=="__main__": ,作為area.py 導入文件時const.py
中的所有代碼都被執行了,而加上之後就只執行導入的部分程式碼。
這就是 if __name__=="__main__": 顯而易見的作用,實際上 if __name__=="__main__": 就相當於是
Python 模擬的程式入口。由於模組之間相互引用,不同模組可能都有這樣的定義,而入口程式只能有一個,選取哪個入口程式取決於 __name__ 的值。
我們再來看一個小程式:
print("look here") print(__name__) if __name__ == '__main__': print("I'm test.py")
程式的執行結果如下:
look here __main__ I'm test.py
可以發現,此時變數__name__ 的值為__main__,所以印出“I'm
test.py”。如果執行其他文件,透過執行的文件呼叫本文件,則不會列印該語句,因為程式入口不對,該語句不執行。
有了if __name__=="__main__": 相當於Python
程式也有了一個入口函數,我們可以清晰的知道程式的邏輯開始於何處,當然還需要我們自覺的把程式的開始邏輯都放在這裡。其實,這也是 PyCharm
推薦的做法。
為什麼很多優秀的程式語言,像是C、Java、Golang、C 都有一個main
入口函數呢?我想很重要的一個原因就是程式入口統一,容易閱讀。
如果你用多進程來做並行計算,類似這樣的程式碼:
import multiprocessing as mp def useful_function(x): return x * x print("processing in parallel") with mp.Pool() as p: results = p.map(useful_function, [1, 2, 3, 4]) print(results)
運行這段程式碼,控制台會一直印出:
processing in parallel processing in parallel processing in parallel processing in parallel processing in parallel processing in parallel processing in parallel processing in parallel processing in parallel
且程式會不停的報錯RuntimeError。
如果你加上了if __name__=="__main__": ,程式就會按照預期的進行:
import multiprocessing as mp def useful_function(x): return x * x if __name__ == '__main__': print("processing in parallel") with mp.Pool() as p: results = p.map(useful_function, [1, 2, 3, 4]) print(results)
Python 的多程式就是啟動了多個Python 解器器,每個Python 解釋器都會導入你這個腳本,複製一份全域變數和函數給子程序用,如果有了if
__name__=="__main__":,那它後面的程式碼就不會被import,也就不會重複執行。否則,這個創建多進程的程式碼就會被
import,就會被執行,從而無限遞歸的去創建子進程
以上是寫 Python 腳本,一定要加這個!的詳細內容。更多資訊請關注PHP中文網其他相關文章!