在Python中定義Main函數(第三部分)

2021-02-19 Python程式設計師

創建名為main()的函數來包含要運行的代碼

現在,您可以編寫作為腳本由從命令行執行並導入且沒有副作用的Python代碼。接下來,您將學習如何編寫代碼並使其他程式設計師能輕鬆地理解其含義。

許多語言,如C,C++,Java以及其他的一些語言,都會定義一個叫做main()的函數,當編譯程序時,作業系統會自動調用該函數。此函數通常被稱為入口點(entry point),因為它是程序進入執行的起始位置。

相比之下,Python沒有一個特殊的函數作為腳本的入口點。實際上在Python中可以將入口點定義成任何名稱。

儘管Python不要求將函數命名為main(),但是最佳的做法是將入口點函數命名為main()。這樣方便其他程式設計師定位程序的起點。

此外,main()函數應該包含Python解釋器執行文件時要運行的任何代碼。這比將代碼放入條件語塊中更好,因為用戶可以在導入模塊時重複使用main()函數。

修改best_practices.py文件如下所示:

在這個示例中,定義了一個main()函數,它包含了上面的條件語句塊。之後修改條件語塊執行main()。如果您將此代碼作為腳本運行或導入,將獲得與上一節相同的輸出。

在main()中調用其他函數

另一種常見的實現方式是在main()中調用其他函數,而不是直接將代碼寫入main()。這樣做的好處在於可以實現將幾個獨立運行的子任務整合。

例如,某個腳本有如下功能:

從數據源如資料庫,文件,硬碟或web API讀取數據。

處理數據。

將處理後的數據寫入另一個位置。

如果在單獨的函數中各自實現這些子任務,您(或其他用戶)可以很容易地實現代碼重用。之後您可以在main()函數中創建默認的工作流。

您可以根據自己的情況選擇是否使用此方案。將任務拆分為多個函數會使重用更容易,但會增加他人理解代碼的難度。

修改best_practices.py文件如下所示:

在此示例代碼中,文件的前10行具有與之前相同的內容。第12行的第二個函數創建並返回一些示例數據,第17行的第三個函數模擬將修改後的數據寫入資料庫。

第21行定義了main()函數。在此示例中,對main()做出修改,它將調用數據讀取,數據處理以及數據寫入等功能。

首先,從read_data_from_web()中創建data。將data作為參數傳入process_data(),之後將返回modified_data。最後,將modified_data傳入write_data_to_database()。

腳本的最後兩行是條件語塊用於驗證__name__,並且如果if語句為True,則執行main()。

在命令行中運行如下所示:

根據執行結果,Python解釋器在執行main()函數時,將依次執行read_data_from_web(),process_data()以及write_data_to_database()。當然,您也可以導入best_practices.py文件並重用process_data()作為不同的數據輸入源,如下所示:

在此示例中,導入了best_practices並且將其簡寫為bp。

導入過程會導致Python解釋器執行best_practices.py的全部代碼,因此輸出顯示解釋文件用途的信息。

然後,從文件中存儲數據而不是從Web中讀取數據。之後,可以重用best_practices.py文件中的process_data()和write_data_to_database()函數。在此情況下,可以利用代碼重寫來取代在main()函數中實現全部的代碼邏輯。

實踐總結

以下是Python中main()函數的四個關鍵最佳實踐:

將計算時間過長或對計算機產生其他影響的代碼寫入函數或類,這樣可以精確地控制代碼的運行時間。

使用不同的__name__值來確定上下文並使用條件語句更改代碼的行為。

將入口點函數命名為main(),以便傳達函數的意圖,即使Python對名為main()的函數並沒有賦予特殊的含義。

如果想代碼重用,請在main()外定義函數,並在main()中對其進行調用。

結論

恭喜!您現在已經了解如何創建Python main()函數了。

本文介紹了如下內容:

了解__name__變量的值對於編寫用於可執行腳本和導入模塊的雙重用途的代碼的重要性。

根據執行Python文件的方式,__name__具有不同的值。__name__的取值有以下幾種情況:

對於開發可重用的代碼,Python程式設計師已經提供了一套良好的方案。

現在,您可以開始編寫一些非常棒的關於Python main()函數代碼啦!

英文原文:https://realpython.com/python-main-function/ 
譯者:我是暱稱耶~

相關焦點

  • Python 中的 main 函數
    毫無疑問 Python 中沒有所謂的 main 入口函數,但是網上經常看到一些文章提「Python 的 main 函數」、「建議寫 main 函數」……有些人是知情的,他的意圖可能是模仿那些正宗的 main 函數,但還有不少人明顯是被誤導了(或自己誤解了),就寫出來很累贅的代碼。
  • 為什麼 Python 沒有 main 函數?
    以下為譯文:眾所周知,Python中沒有所謂的main函數,但是網上經常有文章提到「 Python的main函數」和「建議編寫main函數」。其實,可能他們是想模仿真正的main函數,但是許多人都被誤導(或誤解),然後編寫了非常笨拙的代碼。在本文中,我們來討論一下為什麼Python沒有main函數。在開始討論之前,我們先來回答以下兩個問題:所謂的「main函數」究竟是什麼意思?為什麼有些程式語言必須編寫main函數?
  • Python 為什麼沒有 main 函數?為什麼我不推薦寫 main 函數?
    python_cat)毫無疑問 Python 中沒有所謂的 main 入口函數,但是網上經常看到一些文章提「Python 的 main 函數」、「建議寫 main 函數」……有些人是知情的,他的意圖可能是模仿那些正宗的 main 函數,但還有不少人明顯是被誤導了(或自己誤解了),就寫出來很累贅的代碼。
  • 如何簡單地理解 Python 中的 if __name__ == '__main__'
    函數也被運行了,實際上我們不希望它被運行,因為 const.py 提供的 main 函數只是為了測試常量定義。/pythonstudy/main', ...]/usr/bin/python: No module named run.py由於輸出結果只列出了關鍵的部分,應該很容易看出他們之間的差異:以模塊方式運行還有一個不同的地方:多出了一行No module named run.py的錯誤。
  • 好冷的Python-- if __name__=='__main__'是啥東東
    1、__name__是什麼我們知道Python腳本執行時,解釋器會從文件開始逐行往後解析,如果遇到用def定義的函數或class定義的類,就會跳過該段代碼,如果是頂格寫的某些語句就會執行它,即使這個py文件是作為模塊被導入到其他文件中。
  • 自定義 Python 類中的運算符和函數重載(上)
    默認情況下, 大多數內置函數和運算符都不能與自定義類的對象一起使用。必須在類定義中添加相應的特殊方法,才能使對象與內置和運算符兼容。執行此操作時,與其關聯的函數或運算符的行為將根據方法中定義的方式進行更改。這正是數據模型(Python 文檔的3節) 幫助你完成的內容。
  • Python中的__name__ == 「__main__」
    特殊函數相信許多人初學 Python 時,常會在例子程序中看到如下語句:__name__ == "__main__",大家是不是覺得很難理解,其實這個__name__就是我們的特殊函數__name__這個系統變量顯示了當前模塊執行過程中的名稱,如果當前程序運行在這個模塊中
  • Python之父教你寫main()函數
    編程派微信號:codingpy每個程式設計師在學習編程的過程中,肯定沒少寫過main()函數,Python程式設計師也不例外。本文為大家分享Python之父Guido van Rossum推薦的函數寫法,可以大大提高這個函數的靈活性。有篇文章將Guido列入了歷史上最偉大的12名程式設計師之一哦。
  • 為什麼我不推薦寫 main 函數?
    作者:豌豆花下貓來源:Python貓公眾號毫無疑問 Python 中沒有所謂的 main 入口函數,但是網上經常看到一些文章提「Python 的 main 函數」、「建議寫 main 函數」……有些人是知情的,他的意圖可能是模仿那些正宗的 main 函數,但還有不少人明顯是被誤導了(或自己誤解了),就寫出來很累贅的代碼。
  • python核心部分創建對象中各種名詞的定義及用法
    但是python被稱為面向對象的語言,所以創建對象才是python的核心部分,我們今天就走進python的核心部分-創建對象。接下來幾天的章節非常重要非常核心,非常重要非常核心,非常重要非常核心,重要的事情說是三次。首先說一下幾個名詞的定義,方便你在以後的學習中理解。
  • Python入門基礎中怎麼定義函數,函數調用,函數傳遞參數
    定義一個函數你可以定義一個由自己想要功能的函數,以下是簡單的規則:函數代碼塊以def關鍵詞開頭,後面依次寫出函數名、括號、括號中的參數和冒號。任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數。函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。函數內容以冒號起始,在縮進塊中編寫函數體。return 表達式結束函數,選擇性地返回一個值給調用方。
  • python 函數定義以及函數的調用
    函數的定義1. 函數的定義的格式def 函數名(參數):passreturn 表達式2.in li:print(True if i > 8 else False)方法二 定義一個 fun()的函數名def fun(li):for i in li:print(True if i &
  • Python中簡單的函數,再不會就不好意思了
    @Author :By Runsen函數在Python中的函數就是為了實現某一段功能的代碼段,可以重複利用。>my_func('Hello World')# 輸出Got a message: Hello World簡單的知識點def是函數的聲明my_func是函數的名稱message 是函數的參數print 是函數的主體部分在函數的最後 可以返回調用結果(return 或yield ),也可以不返回定義在前,調用在後def my_sum
  • 深度剖析C語言的main函數!
    這可能是因為 在 C 和 C++ 中,不接收任何參數也不返回任何信息的函數原型為「void foo(void);」。可能正是因為這個,所以很多人都誤認為如果不需要程序返回值時可以把main函數定義成void main(void) 。然而這是錯誤的!main 函數的返回值應該定義為 int 類型,C 和 C++ 標準中都是這樣規定的。
  • python基礎--自定義模塊、import、from......import......
    如果你退出python解釋器然後重新進入,那麼你之前定義的函數或者變量都將丟失,因此我們通常將程序寫到文件中以便永久保存下來,需要時就通過python test.py方式去執行,此時test.py被稱為腳本script。所以,腳本就是一個python文件,比如你之前寫的購物車,模擬博客園登錄系統的文件等等。3.模塊的分類Python語言中,模塊分為三類。
  • Python之函數學習(八)
    在python中,函數的定義是使用關鍵字def,下面先來定義一個簡單的函數,通過這個例子來認識函數,見代碼:def f():   print('Hello World')在如上的代碼中,可以看到自定義了函數f,函數中輸出是 :Hello World,那麼編寫函數後,怎麼來進行調用函數了,函數的調用也是很簡單的,像如上的函數調用為:f(),就會輸出:Hello
  • 深度剖析C語言的main函數
    C/C++ 中從來沒有定義過void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主頁上的 FAQ 中明確地寫著 「The definition void main( ) { /* … */ } is not and never has been C++, nor has it even been C.」
  • 乾貨 | 深度剖析C語言的main函數
    C/C++ 中從來沒有定義過void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主頁上的 FAQ 中明確地寫著 「The definition void main( ) { /* … */ } is not and never has been C++, nor has it even been C.」
  • 深度剖析C語言的main函數
    void main()有一些書上的,都使用了void main( ) ,其實這是錯誤的。C/C++ 中從來沒有定義過void main( ) 。可能正是因為這個,所以很多人都誤認為如果不需要程序返回值時可以把main函數定義成void main(void) 。然而這是錯誤的!main 函數的返回值應該定義為 int 類型,C 和 C++ 標準中都是這樣規定的。雖然在一些編譯器中,void main() 可以通過編譯,但並非所有編譯器都支持 void main() ,因為標準中從來沒有定義過 void main 。
  • Python中的 if __name__ == 「__main__「
    對於Python初學者來說,在看別人代碼時經常會看到if __name__ == "__main__",這時心裡就開始吐槽:「絕對又是裝X,我特麼不寫這句話