在Python中定義Main函式(第二部分)

2021-09-23 14:29:53 字數 2523 閱讀 1131

main函式的最佳實踐

既然您已經了解兩種執行方式上的差異,那麼掌握一些最佳實踐方案還是很有用的。它們將適用於編寫作為指令碼執行的**或者在另乙個模組匯入的**。

如下是四種實踐方式:

將大部分**放入函式或類中。

使用__name__控制**的執行。

建立名為main()的函式來包含要執行的**。

在main()中呼叫其他函式。

將大部分**放入函式或類中

請記住,python直譯器在匯入模組時會執行模組中的所有**。有時如果想要實現使用者可控的**,會導致一些***,例如:

執行計算時間過長的程式

將檔案寫入磁碟

列印會擾亂使用者終端的資訊

在這種情況下,想要實現使用者控制觸發此**的執行,而不是讓python直譯器在匯入模組時執行**。

因此,最佳方法是將大部分**包含在函式或類中。這是因為當python直譯器遇到def或class關鍵字時,它只儲存這些定義供以後使用,並且在使用者通知之前不會實際執行。

將如下**儲存在best_practices.py以證明這個想法:

在此**中,首先從time模組中匯入sleep()。

在這個示例中,引數以秒的形式傳入sleep()函式中,直譯器將暫停一段時間再執行。隨後,使用print()函式列印關於**描述的語句。

之後,定義乙個process_data()函式,執行如下五項操作:

列印一些輸出資訊以通知使用者資料處理正在啟動

修改輸入資料

暫停執行3秒sleep()函式

列印一些輸出資訊以通知使用者處理已完成

返回修改後的資料

在命令列中執行

當你將此檔案作為指令碼用命令列執行時會發生什麼呢?

python直譯器將執行函式定義之外的from time import sleep和print(),之後將建立函式process_data()。然後,指令碼將退出而不做任何進一步的操作,因為指令碼沒有任何執行process_data()的**。

如下是這段指令碼的執行結果:

我們在這裡看到的輸出是第乙個print()的結果。注意,從time匯入和定義process_data()函式不產生結果。具體來說,呼叫定義在process_data()內部的print()不會列印結果。

匯入模組或直譯器執行

在會話(或其他模組)中匯入此檔案時,python直譯器將執行相同的步驟。

python直譯器匯入檔案後,您可以使用已匯入模組中定義的任何變數,類或函式。為了證明這一點,我們將使用可互動的python直譯器。啟動直譯器,然後鍵入import best_practices:

匯入best_practices.py後唯一的輸出來自process_data()函式外定義的print()。匯入模組或直譯器執行與基於命令列執行類似。

使用__name__控制**的執行

如何實現基於命令列而不使用python直譯器匯入檔案來執行呢?

您可以使用__name__來決定執行上下文,並且當__name__等於"__main__"時才執行process_data()。在best_practices.py檔案中新增如下**:

這段**新增了乙個條件語句來檢驗__name__的值。當值為"__main__"時,條件為true。記住當__name__變數的特殊值為"__main__"時意味著python直譯器會執行指令碼而不是將其匯入。

條件語塊內新增了四行**(第12,13,14和15行):

第12和13行:建立變數data,用於儲存從web獲取的資料並列印。

第14行:處理資料。

第15行:列印修改後的資料。

現在,在命令列中執行best_practices.py,並觀察輸出的變化:

首先,輸出顯示了process_data()函式外的print()的呼叫結果。

之後,data的值被列印。因為當python直譯器將檔案作為指令碼執行時,變數__name__具有值"__main__",因此條件語句被計算為true。

接下來,指令碼將呼叫process_data()並傳入data進行修改。當process_data執行時,將輸出一些狀態資訊。最終,將輸出modified_data的值。

現在您可以驗證從直譯器(或其他模組)匯入best_practices.py後發生的事情了。如下示例演示了這種情況:

注意,當前結果與將條件語句新增到檔案末尾之前相同。因為此時__name__變數的值為"best_practices",因此條件語句結果為false,python將不執行process_data()。

英文原文:

譯者:我是暱稱耶~

golang中的init函式和main函式

main 函式只能在package main中。init 函式可在package main中,可在其他package中,可在同乙個package中出現多次。golang裡面有兩個保留的函式 init函式 能夠應用於所有的package 和main函式 只能應用於package main 這兩個函式在...

python中的main函式

python是一種解釋型指令碼語言,和c c 語言不同,c c 程式從main函式開始執行,python程式從開始到結尾順序執行。先總結下python中的main函式的作用 讓模組 函式 可以自己單獨執行 除錯 相當於構造了呼叫其它函式的入口,這就類似於c c 裡面的main函式了。一方面 我們想要...

python中main 函式寫法

usr bin python import sys import getopt class usage exception def init self,msg self.msg msg defmain ar none if ar is none ar sys.ar try try opts,args...