重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
一般來(lái)說(shuō),Python程序員可能是這樣寫(xiě)main()函數(shù)的:
創(chuàng)新互聯(lián)建站是一家專(zhuān)業(yè)提供京口企業(yè)網(wǎng)站建設(shè),專(zhuān)注與網(wǎng)站制作、網(wǎng)站建設(shè)、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為京口眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
"""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也承認(rèn)之前自己寫(xiě)的main()函數(shù)也是類(lèi)似的結(jié)構(gòu),但是這樣寫(xiě)的靈活性還不夠高,尤其是需要解析復(fù)雜的命令行選項(xiàng)時(shí)。為此,他向大家提出了幾點(diǎn)建議。
添加可選的 argv 參數(shù)
首先,修改main()函數(shù),使其接受一個(gè)可選參數(shù) argv,支持在交互式shell中調(diào)用該函數(shù):
def main(argv=None):
if argv is None:
argv = sys.argv # etc., replacing sys.argv with argv in the getopt() call.1234
這樣做,我們就可以動(dòng)態(tài)地提供 argv 的值,這比下面這樣寫(xiě)更加的靈活:
def main(argv=sys.argv):
# etc.12
這是因?yàn)樵谡{(diào)用函數(shù)時(shí),sys.argv 的值可能會(huì)發(fā)生變化;可選參數(shù)的默認(rèn)值都是在定義main()函數(shù)時(shí),就已經(jīng)計(jì)算好的。
但是現(xiàn)在sys.exit()函數(shù)調(diào)用會(huì)產(chǎn)生問(wèn)題:當(dāng)main()函數(shù)調(diào)用sys.exit()時(shí),交互式解釋器就會(huì)推出!解決辦法是讓main()函數(shù)的返回值指示退出狀態(tài)(exit status)。因此,最后面的那行代碼就變成了這樣:
if __name__ == "__main__":
sys.exit(main())12
并且,main()函數(shù)中的sys.exit(n)調(diào)用全部變成return n。
定義一個(gè)Usage()異常
另一個(gè)改進(jìn)之處,就是定義一個(gè)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ù)就只有一個(gè)退出點(diǎn)(exit)了,這比之前兩個(gè)退出點(diǎn)的做法要好。而且,參數(shù)解析重構(gòu)起來(lái)也更容易:在輔助函數(shù)中引發(fā)Usage的問(wèn)題不大,但是使用return 2卻要求仔細(xì)處理返回值傳遞的問(wèn)題。
Python 有很多有用的內(nèi)置函數(shù), 但還是不能滿(mǎn)足程序員的需求, 所以需要 自定義函數(shù) 。
如何編寫(xiě) 自定義函數(shù) , 需要用到 def語(yǔ)句, 函數(shù)名, 括號(hào)及參數(shù), 冒號(hào), 函數(shù)說(shuō)明,內(nèi)置縮進(jìn)編碼模塊,return 語(yǔ)句 , 其中有一些也可省略不寫(xiě),后面會(huì)慢慢介紹。
編寫(xiě)函數(shù)不可或缺的元素, 一定都要寫(xiě)。函數(shù)名盡量寫(xiě)得簡(jiǎn)單易懂。
一般是對(duì)函數(shù)的描述說(shuō)明。
這是編寫(xiě)具體的 操作命令 的地方, 如果還未想好如何編寫(xiě), 可以使用 pass 來(lái)占位,讓程序可以運(yùn)行起來(lái),防止調(diào)試出錯(cuò)。
參數(shù)放在最后講, 是因?yàn)檫@里面的東西還是很多的。首先看個(gè)例子。
如上的案例都是限制了參數(shù)個(gè)數(shù)的, 最多傳三個(gè)參數(shù) name/age/city , 但是如果有一些特例,需要傳多個(gè)參數(shù)怎么辦呢。 參數(shù)前面加個(gè) * , 變成 可變參數(shù) 。
那如果想要傳多個(gè)包含名稱(chēng)的參數(shù),例如a=1,b=2,c=3......,那該怎么寫(xiě)呢。參數(shù)前面加個(gè) ** , 變成 關(guān)鍵字參數(shù) 。
print?'main'當(dāng)腳本作為執(zhí)行腳本時(shí)__name__的值為_(kāi)_main__當(dāng)腳本作為模塊時(shí)__name__為模塊文件名。
main函數(shù)在程序中大多數(shù)是必須存在的。C語(yǔ)言標(biāo)準(zhǔn)中強(qiáng)制要求main函數(shù)的返回值類(lèi)型為int,main函數(shù)的返回值是傳遞給操作系統(tǒng),讓操作系統(tǒng)判斷程序的執(zhí)行情況。
一個(gè)程序,無(wú)論復(fù)雜或簡(jiǎn)單,總體上都是一個(gè)“函數(shù)”;這個(gè)函數(shù)就稱(chēng)為“main 函數(shù)”,也就是“主函數(shù)”。比如有個(gè)“做菜”程序,那么“ 做菜 ”這個(gè)過(guò)程就是“主函數(shù)”。在主函數(shù)中,根據(jù)情況,你可能還需要調(diào)用“買(mǎi)菜,切菜,炒菜”等子函數(shù)。
main函數(shù)在程序中大多數(shù)是必須存在的,但是依然有例外情況,比如windows編程中可以編寫(xiě)一個(gè)動(dòng)態(tài)鏈接庫(kù)模塊,這是其他windows程序可以使用的代碼。由于DLL模塊不是獨(dú)立的程序,因此不需要main函數(shù)。
從函數(shù)的形勢(shì)看,函數(shù)分兩類(lèi):
無(wú)參函數(shù)。printstar和print_message就是無(wú)參函數(shù)。在調(diào)用無(wú)參函數(shù)時(shí),主調(diào)函數(shù)并不將數(shù)據(jù)傳送給被調(diào)用函數(shù),一般用來(lái)執(zhí)行指定的一組操作。
有參函數(shù)。在調(diào)用函數(shù)時(shí),在主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞。也就是說(shuō),主調(diào)函數(shù)可以將數(shù)據(jù)傳遞給被調(diào)用函數(shù)使用,被調(diào)用函數(shù)中的數(shù)據(jù)也可以帶回來(lái)供主調(diào)函數(shù)使用。
使用關(guān)鍵詞 def 聲明這是一個(gè)函數(shù)
1def 函數(shù)名 (參數(shù)):
2 語(yǔ)句塊
參數(shù)可以沒(méi)有,也可以有多個(gè),用逗號(hào)隔開(kāi),第一行稱(chēng)為函數(shù)頭,結(jié)尾一定要加冒號(hào),代表開(kāi)始進(jìn)入函數(shù)體的執(zhí)行。
語(yǔ)句塊也就是函數(shù)體,是關(guān)于這個(gè)函數(shù)要實(shí)現(xiàn)的功能的語(yǔ)句,語(yǔ)句要有返回值即return語(yǔ)句,如果沒(méi)有return語(yǔ)句,就代表return none.