爲何 Python 沒有 main 函數?python
衆所周知,Python中沒有所謂的main函數,可是網上常常有文章提到「 Python的main函數」和「建議編寫main函數」。程序員
其實,可能他們是想模仿真正的main函數,可是許多人都被誤導(或誤解),而後編寫了很是笨拙的代碼。面試
在本文中,咱們來討論一下爲何Python沒有main函數。編程
在開始討論以前,咱們先來回答如下兩個問題:網絡
所謂的「main函數」到底是什麼意思?架構
爲何有些編程語言必須編寫main函數?運維
一些編程語言將main函數做爲程序的執行入口,好比C/C++、C#、Java、Go、Rust等等,這個函數具備特定的含義:編程語言
main函數名是必須的,這意味着必須有一個主函數。分佈式
最多隻能有一個main函數,這意味着程序的入口是惟一的。函數
語法格式有特定要求,書寫形式也相對固定。
爲何必須強制main函數做爲入口?
這些語言都是編譯語言,須要將代碼編譯成可執行的二進制文件。爲了讓操做系統/引導程序找到程序的開頭,須要定義這樣一個函數。
簡而言之,須要在大量可執行的代碼中定義一個相當重要的的開頭。
不難看出,對於這些語言來講,main函數是不可或缺的組成部分。
可是,當咱們把目光轉向Python時,就會發現狀況大不相同。
Python是一種解釋語言,即腳本語言。運行過程是從上到下,逐行進行的,這意味着它的起點是已知的。
每一個.py文件都是一個可執行文件,可做爲整個程序的入口文件,意味着該程序的入口很靈活,並且無需遵循任何約定。
有時運行Python項目時不須要有指定入口文件(命令行比較常見,例如「 python -m http.server 8000」),多是由於該項目中有main.py文件,在軟件包中做爲「文件」來執行。
總而言之,Python做爲腳本語言不一樣於編譯語言。不管是單個模塊(即.py文件),仍是由多個模塊組成的軟件包,Python均可以選擇一種靈活的執行方法,這徹底不像其餘語言那樣必須定義入口。
換句話說,Python不須要規定程序員必須在語法上定義一個統一的入口(不管是函數、類仍是其餘東西)。
有些學生可能會感到困惑,由於他們常常看到或編寫如下代碼:
main file
def main():
……
if name == '__main__':
main()
這不就是Python的main函數嗎?相信不少人都這麼認爲!
不,並非。
除了函數名是「main」以外,這段代碼與咱們前面介紹的main函數沒有半點關係,這個函數既不是必須的,也不能肯定程序的執行順序。即使沒有上面這樣的main函數,也不會有任何的語法問題。
人們想編寫一個main函數的主要緣由實際上是爲了強調這是一個主函數,但願人爲地將其設置成第一個執行的函數。
他們可能認爲這個名字的函數更容易記住。
他們之因此要編寫__name__ =='__main__',多是由於想代表main()只在直接執行當前腳本時才運行,而在將其導入到其餘模塊時不要運行。
可是,我我的不推薦這種寫法。
舉一個簡單的例子,假設只有幾十行代碼,或者一個腳本文件實現了一個簡單的功能(一個爬蟲,或畫一隻烏龜,等等),但都是按照前面的方式編寫的。
不推薦if name == '__main__'的寫法,由於:
首先,若是隻有一個文件的話,那麼這個文件不可能被導出。
其次,若是有多個文件,強烈建議不要將這個語句寫在入口文件(main.py)中。從理論上講,它的內容不該該導出供其餘模塊使用,由於它是起點。
最後,在多個文件的狀況下,也不建議在非入口的文件中寫入這條語句,由於這條語句能作的最多也就是編寫一些測試代碼。即使如此,測試代碼也應分開寫到專用目錄或文件中。
每次看到這些笨拙的代碼時,我都會感到不適。爲何要寫這樣的if語句?你壓根不該該將這段代碼包裝成一個函數!
總結
打破慣性思惟,編寫真實的代碼。main函數是某些語言的惟一入口,但不該在Python中使用。你應該瞭解腳本語言的特徵,並學習簡單而優雅的風格。
你可使用main.py,而不是編寫main函數。因爲Python程序的執行單元是腳本文件,而不是函數或類,所以建議將入口文件命名爲main.py,並根據須要決定內部的函數。
將main.py做爲入口文件。該文件可直接與命令行的「-m」參數結合使用。
※部分文章來源於網絡,若有侵權請聯繫刪除;更多文章和資料|點擊後方文字直達 ↓↓↓
100GPython自學資料包
阿里雲K8s實戰手冊
[阿里雲CDN排坑指南] CDN
ECS運維指南
DevOps實踐手冊
Hadoop大數據實戰手冊
Knative雲原生應用開發指南
OSS 運維實戰手冊
雲原生架構白皮書
Zabbix企業級分佈式監控系統源碼文檔
10G大廠面試題戳領