寫 Python 腳本,一定要加這個!
使用 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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。
