為什麼Python沒有main()函式?
在這篇文章中,我們將學習為什麼Python沒有main()函式。
毫無疑問,Python **沒有**所謂的**主函式**,但是,網際網路上的文章經常提到“**Python的主函式**”和“**建議編寫主函式**”。
他們的目的可能是為了複製原始的主要方法,但是許多人因此被誤導(或誤解),並建立了極其複雜的程式碼。
在我們開始之前,我們將回答以下兩個問題:
“主函式”到底是什麼?
為什麼一些程式語言需要使用主函式?
一些程式語言,例如C/C++、C#、Java、Go、Rust等,使用主函式作為程式的執行入口,這具有特殊的含義:
此主函式名稱是必需的,這意味著必須有一個主函式。
因為只能有一個主函式,所以每個程式入口都是唯一的。
語法格式有特定的要求,並遵循非常一致(固定)的模板。
為什麼必須強制執行主入口函式?
這些是編譯型語言,需要將程式碼編譯成可執行二進位制檔案,以便作業系統/引導載入程式找到程式的起始位置,因此必須定義此函式。
簡單來說,在一大堆可執行程式碼中,必須定義一個明確的開始。
主函式是這些語言的一個重要的有機特性。
但是,當我們回到Python時,情況發生了巨大的變化。
Python是一種解釋型語言,也稱為指令碼語言。執行過程從上到下,一行一行地執行,這意味著它的起始點是已知的。
每個**.py檔案**都是一個可執行檔案,可以用作程式的入口點,這意味著程式的入口點是靈活的,不需要遵循任何約定。
在不指定入口檔案(更常見的命令列,例如“**python -m http.server 8000**”)的情況下執行Python專案時,可能是因為存在main.py檔案,該檔案作為包中的一個“檔案”來執行操作。
總而言之,指令碼語言Python與編譯型語言不同。它可以選擇在單個模組(即.py檔案)級別或由許多模組組成的包級別靈活的執行方式,這與其他無法在沒有明確定義的入口的情況下實現的語言不同。
換句話說,Python不需要程式設計師在語法級別上指定統一的入口(無論是函式、類還是其他)。
一些使用者可能會感到困惑,因為他們經常遇到或編寫以下程式碼:
# defining the main function using the def keyword def main(): …… if __name__ == '__main__': main()
這不是Python的主函式嗎?我相信我們很多人都會同意!
不,它不是。
除了函式名稱為“**main**”之外,它與我們前面描述的正統主函式沒有任何聯絡,它既不是必需的,也不一定控制程式執行的順序。沒有它也不會導致任何語法問題。
有些人希望標識一個“**main**”函式來強調其“主要”狀態,並將其人工放置為第一個執行的函式。
他們可能認為這樣命名的函式更容易記住。
他們可能希望編寫`if __name__ == '__main__':`來表明`main()`僅在直接執行當前指令碼時執行,而當將其匯入其他模組時不應執行。
但是,我們不建議這種編寫風格。
最常見的例子:只有幾十行程式碼或一個實現簡單功能的指令碼檔案(一個小爬蟲,用turtle畫圖等),但它們都以與之前相同的方式編寫。
由於以下原因,不建議編寫`if __name__ == '__main__':`:
首先,如果只有一個檔案,因為沒有匯出選項。
其次,如果有多個檔案,強烈不建議在入口檔案(main.py)中編寫此語句。因為它作為起點,其內容不應匯出以供其他模組使用。
最後,不建議在有多個檔案的非入口檔案中編寫此判斷,因為最多隻能建立一些這樣的測試程式。但是,測試程式碼應該分開儲存在單獨的目錄或檔案中。
每當我遇到這種複雜的程式碼而沒有思考時,我都會感到擔憂。你為什麼寫那個if語句?如果可能的話,拆分主函式,甚至不要把它包裝在一個函式中!
總結
擺脫慣性思維,構建真實的程式碼。主入口函式是某些語言所特有的,不應在Python中使用。你應該理解指令碼語言的特性,並以簡潔明瞭的方式編寫。
使用**main.py**代替**main()**。因為Python的程式執行單元是指令碼檔案而不是函式或類,所以入口檔案應該命名為main.py,內部函式則根據需求決定。
如果可行,請使用main.py作為入口檔案。此檔案易於與命令列上的“-m”引數結合使用。
結論
在這篇文章中,我們學習了為什麼Python與其他程式語言不同,它沒有main()函式。我們還學習了條件`__name__ == '__main__'`。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP