print?'main'當腳本作為執(zhí)行腳本時__name__的值為__main__當腳本作為模塊時__name__為模塊文件名。

創(chuàng)新互聯(lián)建站致力于互聯(lián)網(wǎng)品牌建設與網(wǎng)絡營銷,包括網(wǎng)站制作、做網(wǎng)站、SEO優(yōu)化、網(wǎng)絡推廣、整站優(yōu)化營銷策劃推廣、電子商務、移動互聯(lián)網(wǎng)營銷等。創(chuàng)新互聯(lián)建站為不同類型的客戶提供良好的互聯(lián)網(wǎng)應用定制及解決方案,創(chuàng)新互聯(lián)建站核心團隊十載專注互聯(lián)網(wǎng)開發(fā),積累了豐富的網(wǎng)站經(jīng)驗,為廣大企業(yè)客戶提供一站式企業(yè)網(wǎng)站建設服務,在網(wǎng)站建設行業(yè)內樹立了良好口碑。
main函數(shù)在程序中大多數(shù)是必須存在的。C語言標準中強制要求main函數(shù)的返回值類型為int,main函數(shù)的返回值是傳遞給操作系統(tǒng),讓操作系統(tǒng)判斷程序的執(zhí)行情況。
一個程序,無論復雜或簡單,總體上都是一個“函數(shù)”;這個函數(shù)就稱為“main 函數(shù)”,也就是“主函數(shù)”。比如有個“做菜”程序,那么“ 做菜 ”這個過程就是“主函數(shù)”。在主函數(shù)中,根據(jù)情況,你可能還需要調用“買菜,切菜,炒菜”等子函數(shù)。
main函數(shù)在程序中大多數(shù)是必須存在的,但是依然有例外情況,比如windows編程中可以編寫一個動態(tài)鏈接庫模塊,這是其他windows程序可以使用的代碼。由于DLL模塊不是獨立的程序,因此不需要main函數(shù)。
從函數(shù)的形勢看,函數(shù)分兩類:
無參函數(shù)。printstar和print_message就是無參函數(shù)。在調用無參函數(shù)時,主調函數(shù)并不將數(shù)據(jù)傳送給被調用函數(shù),一般用來執(zhí)行指定的一組操作。
有參函數(shù)。在調用函數(shù)時,在主調函數(shù)和被調用函數(shù)之間有數(shù)據(jù)傳遞。也就是說,主調函數(shù)可以將數(shù)據(jù)傳遞給被調用函數(shù)使用,被調用函數(shù)中的數(shù)據(jù)也可以帶回來供主調函數(shù)使用。
使用關鍵詞 def 聲明這是一個函數(shù)
1def 函數(shù)名 (參數(shù)):
2 語句塊
參數(shù)可以沒有,也可以有多個,用逗號隔開,第一行稱為函數(shù)頭,結尾一定要加冒號,代表開始進入函數(shù)體的執(zhí)行。
語句塊也就是函數(shù)體,是關于這個函數(shù)要實現(xiàn)的功能的語句,語句要有返回值即return語句,如果沒有return語句,就代表return none.
定義函數(shù)需要注意的幾個事項:
1、def開頭,代表定義函數(shù)
2、def和函數(shù)名中間要敲一個空格
3、之后是函數(shù)名,這個名字用戶自己起的,方便自己使用就好
4、函數(shù)名后跟圓括號(),代表定義的是函數(shù),里邊可加參數(shù)
5、圓括號()后一定要加冒號: 這個很重要,不要忘記了
6、代碼塊部分,是由語句組成,要有縮進
7、函數(shù)要有返回值return
下面是幾個例子:
1 #python中的函數(shù)定義,使用和傳參
2 def_str = '''\
3 python中的函數(shù)以如下形式聲明:
4
5 def 函數(shù)名稱([參數(shù)1,參數(shù)2,參數(shù)3......]):
6 執(zhí)行語句
7
8 如:
9
10 def helloWorld():
11 print('hello')
12
13 if __name__ == '_main__':
14 helloWorld()
15
16 輸出:hello
17 '''
18 print(def_str)
19
20 #下面進行舉例說明
21
22 def helloWorld():
23 print('輸出:hello')
24
25 if __name__ == '__main__':
26 helloWorld()
27
28 print('''\
29 ################################################
30
31 函數(shù)可以帶參數(shù)和返回值,參數(shù)將按從左到右的匹配,
32 參數(shù)可設置默認值,當使用函數(shù)時沒給相應的參數(shù)時,
33 會按照默認值進行賦值
34
35 ################################################
36 ''')
37
38 #定義一個方法:x的y次方
39 def myMethod(x,y):
40 return x**y
41
42 def fib(n):
43 a , b = 0 , 1
44 while a n:
45 print(a, end=' ')
46 a , b = b , a + b
47 print()
48
49 #獲取一個新的數(shù)組
50 #@param oldList 原數(shù)組
51 #@param length 要添加的長度
52 def getList(oldList,length):
53 if length 0:
54 for i in range(0,length):
55 oldList.append(i)
56 return oldList
57 else:
58 return '你輸入的長度小于0'
59
60 def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
61 while True:
62 ok = input(prompt)
63 if ok in ('y', 'ye', 'yes'):
64 return True
65 if ok in ('n', 'no', 'nop', 'nope'):
66 return False
67 retries = retries - 1
68 if retries 0:
69 raise IOError('refusenik user')
70 print(complaint)
71
72 if __name__ == '__main__':
73 x = 3
74 y = 4
75 n = 2000
76 print(x , '的' , y , '次方(' ,x ,'**' , y ,') = ' , myMethod(x,y))
77 print('函數(shù)fib(n),當n =' ,n)
78 fib(n)
79 print(getList(['begin'],-10))
80 ask_ok('y')
運行效果:
Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
================================ RESTART ================================
python中的函數(shù)以如下形式聲明:
def 函數(shù)名稱([參數(shù)1,參數(shù)2,參數(shù)3......]):
執(zhí)行語句
如:
def helloWorld():
print('hello')
if __name__ == '_main__':
helloWorld()
輸出:hello
輸出:hello
################################################
函數(shù)可以帶參數(shù)和返回值,參數(shù)將按從左到右的匹配,
參數(shù)可設置默認值,當使用函數(shù)時沒給相應的參數(shù)時,
會按照默認值進行賦值
################################################
3 的 4 次方( 3 ** 4 ) = 81
函數(shù)fib(n),當n = 2000
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
你輸入的長度小于0
y輸出:hello
Yes or no, please!
y
Yes or no, please!
y
Yes or no, please!
y
Yes or no, please!
y
Traceback (most recent call last):
File "E:/Python33/python_workspace/test_function.py", line 80, in module
ask_ok('y')
File "E:/Python33/python_workspace/test_function.py", line 69, in ask_ok
raise IOError('refusenik user')
OSError: refusenik user
python中定義函數(shù)的關鍵字是def。
Python使用def關鍵字開始函數(shù)定義,緊接著是函數(shù)名,括號內部為函數(shù)的參數(shù),內部為函數(shù)的具體功能實現(xiàn)代碼,如果想要函數(shù)有返回值, 在expressions中的邏輯代碼中用return返回。
上面我們定義了一個名字為 function 的函數(shù),函數(shù)沒有不接受參數(shù),所以括號內部為空,緊接著就是 函數(shù)的功能代碼。
如果執(zhí)行該腳本,發(fā)現(xiàn)并沒有輸出任何輸出,因為我們只定義了函數(shù),而并沒有執(zhí)行函數(shù)。 這時我們在Python命令提示符中輸入函數(shù)調用 function(), 注意這里調用函數(shù)的括號不能省略。
python的學習
如果我們用代碼實現(xiàn)了一個小功能,但想要在程序代碼中重復使用,不能在代碼中到處粘貼這些代碼,因為這樣做違反了軟件工程中DRY原則。 Python提供了函數(shù)功能,可以將我們這部分功能抽象成一個函數(shù)以方便程序調用,或者提供給其他模塊使用。
函數(shù)是組織好的,可重復使用的,用來實現(xiàn)單一,或相關聯(lián)功能的代碼段。(推薦學習:Python視頻教程)函數(shù)必須先定義,才能調用,否則會報錯,無參數(shù)時函數(shù)的調用函數(shù)名()。
有參數(shù)時函數(shù)的調,不要在定義函數(shù)的時候在函數(shù)體里面調用本身,否則會出不來,陷入循環(huán)調用,函數(shù)需要調用函數(shù)體才會被執(zhí)行,單純的只是定義函數(shù)是不會被執(zhí)行的。
目錄
許多編程語言都有一個特殊的函數(shù),當操作系統(tǒng)開始運行程序時會自動執(zhí)行該函數(shù)。這個函數(shù)通常被命名為main(),并且依據(jù)語言標準具有特定的返回類型和參數(shù)。另一方面,Python解釋器從文件頂部開始執(zhí)行腳本,并且沒有自動執(zhí)行的特殊函數(shù)。
盡管如此,為程序的執(zhí)行定義一個起始點有助于理解程序是如何運行的。Python程序員提出了幾種方式對此進行實現(xiàn)。
本文結束時,您將了解以下內容:
Python中的基本main()函數(shù)
一些Python腳本中,包含一個函數(shù)定義和一個條件語句,如下所示:
此代碼中,包含一個main()函數(shù),在程序執(zhí)行時打印Hello World!。此外,還包含一個條件(或if)語句,用于檢查__name__的值并將其與字符串"__main__"進行比較。當if語句為True時,Python解釋器將執(zhí)行main()函數(shù)。更多關于Python條件語句的信息可以由此獲得。
這種代碼模式在Python文件中非常常見,它將作為腳本執(zhí)行并導入另一個模塊。為了幫助理解這段代碼的執(zhí)行方式,首先需要了解Python解釋器如何根據(jù)代碼的執(zhí)行方式設置__name__。
Python中的執(zhí)行模式
Python解釋器執(zhí)行代碼有兩種方式:
更多內容可參考如何運行Python腳本。無論采用哪種方式,Python都會定義一個名為__name__的特殊變量,該變量包含一個字符串,其值取決于代碼的使用方式。
本文將如下示例文件保存為execution_methods.py,以 探索 代碼如何根據(jù)上下文改變行為:
在此文件中,定義了三個對print()函數(shù)的調用。前兩個打印一些介紹性短語。第三個print()會先打印短語The value __name__ is,之后將使用Python內置的repr()函數(shù)打印出__name__變量。
在Python中,repr()函數(shù)將對象轉化為供解釋器讀取的形式。上述示例通過使用repr()函數(shù)來強調__name__的值為字符串。更多關于repr()的內容可參考Python文檔。
在本文中,您將隨處可見文件(file),模塊(module)和腳本(script)這三個字眼。實際上,三者之間并無太大的差別。不過,在強調代碼目的時,還是存在細微的差異:
“如何運行Python腳本”一文也討論了三者的差別。
基于命令行執(zhí)行
在這類方法中,Python腳本將通過命令行來執(zhí)行。
執(zhí)行腳本時,無法與Python解釋器正在執(zhí)行的代碼交互。關于如何通過命令行執(zhí)行代碼的詳細信息對本文而言并不重要,但您可以通過展開下框閱讀更多有關Windows,Linux和macOS之間命令行差異的內容。
命令行環(huán)境
不同的操作系統(tǒng)在使用命令行執(zhí)行代碼時存在細微的差異。
在Linux和macOS中,通常使用如下命令:
美元符號($)之前的內容可能有所不同,具體取決于您的用戶名和計算機名稱。您鍵入的命令位于$之后。在Linux或macOS上,Python3的可執(zhí)行文件名為python3,因此可以通過輸入python3 script_name.py來運行python腳本。
在Windows上,命令提示符通常如下所示:
根據(jù)您的用戶名,之前的內容可能會有所不同,您輸入的命令位于之后。在Windows上,Python3的可執(zhí)行文件通常為python。因此可以通過輸入python script_name.py來運行python腳本。
無論哪種操作系統(tǒng),本文的Python腳本的輸出結果都是相同的。因此本文以Linux和macOS為例。
使用命令行執(zhí)行execution_methods.py,如下所示:
在這個示例中,__name__具有值'__main__',其中引號(')表明該值為字符串類型。
請記住,在Python中,使用單引號(')和雙引號(")定義的字符串沒有區(qū)別。更多關于字符串的內容請參考Python的基本數(shù)據(jù)類型。
如果在腳本中包含"shebang行"并直接執(zhí)行它(./execution_methods.py),或者使用IPython或Jupyter Notebook的%run,將會獲取相同的結果。
您還可以通過向命令行添加-m參數(shù)的方法實現(xiàn)以模塊的方式執(zhí)行。通常情況下,推薦如下方式pip: python3 -m pip install package_name。
添加-m參數(shù)將會運行包中__main__.py的代碼。更多關于__main__.py文件的內容可參考如何將開源Python包發(fā)布到PyPI中。
在三種情況中,__name__都具有相同的值:字符串'__main__'。
技術細節(jié):Python文檔中具體定義了__name__何時取值為'__main__'。
當通過標準輸入,腳本或者交互提示中讀取數(shù)據(jù)時,模塊的__name__將取值為'__main__'。(來源)
__name__與__doc__,__package__和其他屬性一起存儲在模塊的全局命名空間。更多關于屬性的信息可參考Python數(shù)據(jù)模型文檔,特別是關于模塊和包的信息,請參閱Python Import文檔。
導入模塊或解釋器
接下來是Python解釋器執(zhí)行代碼的第二種方式:導入。在開發(fā)模塊或腳本時,可以使用import關鍵字導入他人已經(jīng)構建的模塊。
在導入過程中,Python執(zhí)行指定模塊中定義的語句(但僅在第一次導入模塊時)。要演示導入execution_methods.py文件的結果,需要啟動Python解釋器,然后導入execution_methods.py文件:
在此代碼輸出中,Python解釋器執(zhí)行了三次print()函數(shù)調用。前兩行由于沒有變量,在輸出方面與在命令行上作為腳本執(zhí)行時完全相同。但是第三個輸出存在差異。
當Python解釋器導入代碼時,__name__的值與要導入的模塊的名稱相同。您可以通過第三行的輸出了解這一點。__name__的值為'execution_methods',是Python導入的.py文件。
注意如果您在沒有退出Python時再次導入模塊,將不會有輸出。
注意:更多關于導入在Python中如何工作的內容請參考官方文檔和Python中的絕對和相對導入。
Main函數(shù)的最佳實踐
既然您已經(jīng)了解兩種執(zhí)行方式上的差異,那么掌握一些最佳實踐方案還是很有用的。它們將適用于編寫作為腳本運行的代碼或者在另一個模塊導入的代碼。
如下是四種實踐方式:
將大部分代碼放入函數(shù)或類中
請記住,Python解釋器在導入模塊時會執(zhí)行模塊中的所有代碼。有時如果想要實現(xiàn)用戶可控的代碼,會導致一些副作用,例如:
在這種情況下,想要實現(xiàn)用戶控制觸發(fā)此代碼的執(zhí)行,而不是讓Python解釋器在導入模塊時執(zhí)行代碼。
因此,最佳方法是將大部分代碼包含在函數(shù)或類中。這是因為當Python解釋器遇到def或class關鍵字時,它只存儲這些定義供以后使用,并且在用戶通知之前不會實際執(zhí)行。
將如下代碼保存在best_practices.py以證明這個想法:
在此代碼中,首先從time模塊中導入sleep()。
在這個示例中,參數(shù)以秒的形式傳入sleep()函數(shù)中,解釋器將暫停一段時間再運行。隨后,使用print()函數(shù)打印關于代碼描述的語句。
之后,定義一個process_data()函數(shù),執(zhí)行如下五項操作:
在命令行中執(zhí)行
當你將此文件作為腳本用命令行執(zhí)行時會發(fā)生什么呢?
Python解釋器將執(zhí)行函數(shù)定義之外的from time import sleep和print(),之后將創(chuàng)建函數(shù)process_data()。然后,腳本將退出而不做任何進一步的操作,因為腳本沒有任何執(zhí)行process_data()的代碼。
如下是這段腳本的執(zhí)行結果:
我們在這里看到的輸出是第一個print()的結果。注意,從time導入和定義process_data()函數(shù)不產(chǎn)生結果。具體來說,調用定義在process_data()內部的print()不會打印結果。
導入模塊或解釋器執(zhí)行
在會話(或其他模塊)中導入此文件時,Python解釋器將執(zhí)行相同的步驟。
Python解釋器導入文件后,您可以使用已導入模塊中定義的任何變量,類或函數(shù)。為了證明這一點,我們將使用可交互的Python解釋器。啟動解釋器,然后鍵入import best_practices:
導入best_practices.py后唯一的輸出來自process_data()函數(shù)外定義的print()。導入模塊或解釋器執(zhí)行與基于命令行執(zhí)行類似。
使用__name__控制代碼的執(zhí)行
如何實現(xiàn)基于命令行而不使用Python解釋器導入文件來執(zhí)行呢?
您可以使用__name__來決定執(zhí)行上下文,并且當__name__等于"__main__"時才執(zhí)行process_data()。在best_practices.py文件中添加如下代碼:
這段代碼添加了一個條件語句來檢驗__name__的值。當值為"__main__"時,條件為True。記住當__name__變量的特殊值為"__main__"時意味著Python解釋器會執(zhí)行腳本而不是將其導入。
條件語塊內添加了四行代碼(第12,13,14和15行):
現(xiàn)在,在命令行中運行best_practices.py,并觀察輸出的變化:
首先,輸出顯示了process_data()函數(shù)外的print()的調用結果。
之后,data的值被打印。因為當Python解釋器將文件作為腳本執(zhí)行時,變量__name__具有值"__main__",因此條件語句被計算為True。
接下來,腳本將調用process_data()并傳入data進行修改。當process_data執(zhí)行時,將輸出一些狀態(tài)信息。最終,將輸出modified_data的值。
現(xiàn)在您可以驗證從解釋器(或其他模塊)導入best_practices.py后發(fā)生的事情了。如下示例演示了這種情況:
注意,當前結果與將條件語句添加到文件末尾之前相同。因為此時__name__變量的值為"best_practices",因此條件語句結果為False,Python將不執(zhí)行process_data()。
創(chuàng)建名為main()的函數(shù)來包含要運行的代碼
現(xiàn)在,您可以編寫作為腳本由從命令行執(zhí)行并導入且沒有副作用的Python代碼。接下來,您將學習如何編寫代碼并使其他程序員能輕松地理解其含義。
許多語言,如C,C++,Java以及其他的一些語言,都會定義一個叫做main()的函數(shù),當編譯程序時,操作系統(tǒng)會自動調用該函數(shù)。此函數(shù)通常被稱為入口點(entry point),因為它是程序進入執(zhí)行的起始位置。
相比之下,Python沒有一個特殊的函數(shù)作為腳本的入口點。實際上在Python中可以將入口點定義成任何名稱。
盡管Python不要求將函數(shù)命名為main(),但是最佳的做法是將入口點函數(shù)命名為main()。這樣方便其他程序員定位程序的起點。
此外,main()函數(shù)應該包含Python解釋器執(zhí)行文件時要運行的任何代碼。這比將代碼放入條件語塊中更好,因為用戶可以在導入模塊時重復使用main()函數(shù)。
修改best_practices.py文件如下所示:
在這個示例中,定義了一個main()函數(shù),它包含了上面的條件語句塊。之后修改條件語塊執(zhí)行main()。如果您將此代碼作為腳本運行或導入,將獲得與上一節(jié)相同的輸出。
在main()中調用其他函數(shù)
另一種常見的實現(xiàn)方式是在main()中調用其他函數(shù),而不是直接將代碼寫入main()。這樣做的好處在于可以實現(xiàn)將幾個獨立運行的子任務整合。
例如,某個腳本有如下功能:
如果在單獨的函數(shù)中各自實現(xiàn)這些子任務,您(或其他用戶)可以很容易地實現(xiàn)代碼重用。之后您可以在main()函數(shù)中創(chuàng)建默認的工作流。
您可以根據(jù)自己的情況選擇是否使用此方案。將任務拆分為多個函數(shù)會使重用更容易,但會增加他人理解代碼的難度。
修改best_practices.py文件如下所示:
在此示例代碼中,文件的前10行具有與之前相同的內容。第12行的第二個函數(shù)創(chuàng)建并返回一些示例數(shù)據(jù),第17行的第三個函數(shù)模擬將修改后的數(shù)據(jù)寫入數(shù)據(jù)庫。
第21行定義了main()函數(shù)。在此示例中,對main()做出修改,它將調用數(shù)據(jù)讀取,數(shù)據(jù)處理以及數(shù)據(jù)寫入等功能。
首先,從read_data_from_web()中創(chuàng)建data。將data作為參數(shù)傳入process_data(),之后將返回modified_data。最后,將modified_data傳入write_data_to_database()。
腳本的最后兩行是條件語塊用于驗證__name__,并且如果if語句為True,則執(zhí)行main()。
在命令行中運行如下所示:
根據(jù)執(zhí)行結果,Python解釋器在執(zhí)行main()函數(shù)時,將依次執(zhí)行read_data_from_web(),process_data()以及write_data_to_database()。當然,您也可以導入best_practices.py文件并重用process_data()作為不同的數(shù)據(jù)輸入源,如下所示:
在此示例中,導入了best_practices并且將其簡寫為bp。
導入過程會導致Python解釋器執(zhí)行best_practices.py的全部代碼,因此輸出顯示解釋文件用途的信息。
然后,從文件中存儲數(shù)據(jù)而不是從Web中讀取數(shù)據(jù)。之后,可以重用best_practices.py文件中的process_data()和write_data_to_database()函數(shù)。在此情況下,可以利用代碼重寫來取代在main()函數(shù)中實現(xiàn)全部的代碼邏輯。
實踐總結
以下是Python中main()函數(shù)的四個關鍵最佳實踐:
結論
恭喜!您現(xiàn)在已經(jīng)了解如何創(chuàng)建Python main()函數(shù)了。
本文介紹了如下內容:
現(xiàn)在,您可以開始編寫一些非常棒的關于Python main()函數(shù)代碼啦!
def 函數(shù)名():? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ?函數(shù)體? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?return? 返回值? ? ? ? ? ? ? ? ? ? ? ? ? ??
def 函數(shù)名(非可選參數(shù),可選參數(shù)):
???函數(shù)體?
return 返回值
def 函數(shù)名(參數(shù),*b):
? ? 函數(shù)體
? ? return 返回值
函數(shù)名 = lambda 參數(shù) : 表達式
例1:f = lambda x , y? :? x + y? ? ? ? ? ? ? ? ? ? ? ??
調用:f(6 + 8)? ? ?輸出:14? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
例2:?f = lambda : "沒有參數(shù)的lambda函數(shù)!"
調用:?print(f())? ? 輸出: 沒有參數(shù)的lambda函數(shù)!
一般來說,Python程序員可能是這樣寫main()函數(shù)的:
"""Module docstring.
This serves as a long usage message.
"""import sysimport getoptdef main():
# parse command line options
try:
opts, args = getopt.getopt(sys.argv[1:], "h", ["help"]) except getopt.error, msg: print msg print "for help use --help"
sys.exit(2) # process options
for o, a in opts: if o in ("-h", "--help"): print __doc__
sys.exit(0) # process arguments
for arg in args:
process(arg) # process() is defined elsewhereif __name__ == "__main__":
main()1234567891011121314151617181920212223242526
Guido也承認之前自己寫的main()函數(shù)也是類似的結構,但是這樣寫的靈活性還不夠高,尤其是需要解析復雜的命令行選項時。為此,他向大家提出了幾點建議。
添加可選的 argv 參數(shù)
首先,修改main()函數(shù),使其接受一個可選參數(shù) argv,支持在交互式shell中調用該函數(shù):
def main(argv=None):
if argv is None:
argv = sys.argv # etc., replacing sys.argv with argv in the getopt() call.1234
這樣做,我們就可以動態(tài)地提供 argv 的值,這比下面這樣寫更加的靈活:
def main(argv=sys.argv):
# etc.12
這是因為在調用函數(shù)時,sys.argv 的值可能會發(fā)生變化;可選參數(shù)的默認值都是在定義main()函數(shù)時,就已經(jīng)計算好的。
但是現(xiàn)在sys.exit()函數(shù)調用會產(chǎn)生問題:當main()函數(shù)調用sys.exit()時,交互式解釋器就會推出!解決辦法是讓main()函數(shù)的返回值指示退出狀態(tài)(exit status)。因此,最后面的那行代碼就變成了這樣:
if __name__ == "__main__":
sys.exit(main())12
并且,main()函數(shù)中的sys.exit(n)調用全部變成return n。
定義一個Usage()異常
另一個改進之處,就是定義一個Usage()異常,可以在main()函數(shù)最后的except子句捕捉該異常:
import sysimport getoptclass Usage(Exception):
def __init__(self, msg):
self.msg = msgdef main(argv=None):
if argv is None:
argv = sys.argv try: try:
opts, args = getopt.getopt(argv[1:], "h", ["help"]) except getopt.error, msg: raise Usage(msg) # more code, unchanged
except Usage, err: print sys.stderr, err.msg print sys.stderr, "for help use --help"
return 2if __name__ == "__main__":
sys.exit(main())123456789101112131415161718192021222324
這樣main()函數(shù)就只有一個退出點(exit)了,這比之前兩個退出點的做法要好。而且,參數(shù)解析重構起來也更容易:在輔助函數(shù)中引發(fā)Usage的問題不大,但是使用return 2卻要求仔細處理返回值傳遞的問題。
分享題目:python中主函數(shù)定義 python的主函數(shù)怎么寫
本文鏈接:http://www.yijiale78.com/article38/hhcppp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供標簽優(yōu)化、微信公眾號、動態(tài)網(wǎng)站、網(wǎng)站導航、網(wǎng)站策劃、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)