為什麼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__'`。

更新於:2023年1月2日

998 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.