CDays–3 通過(guò)函數(shù)進(jìn)行功能化 Python基礎(chǔ)教程圖片來(lái)自 《可愛(ài)的Python》 P16 如果我們希望Python 的程序像CMD中的命令一樣,可以添加運(yùn)行參數(shù),那么我們需要將程序做成函數(shù), 就像C語(yǔ)言的函數(shù)。 這種問(wèn)題《可愛(ài)的Python》是不會(huì)告訴我們的,讓我們?nèi)⒖紩?shū)上翻一下?!禤ython 學(xué)習(xí)手冊(cè)》 首先明白一個(gè)問(wèn)題,函數(shù)是什么。 可以這么理解,在程序中,函數(shù)是一個(gè)通用的功能塊,在程序的任何一個(gè)位置調(diào)用一個(gè)函數(shù),他的功能是一樣的。我們可以把一段總在程序中重復(fù)的代碼定義成函數(shù)。 然后在之后的程序中調(diào)用。這樣就可以省去了很多麻煩。 那么如果你學(xué)過(guò)任何一門(mén)語(yǔ)言,那么函數(shù)是很容易理解的。 那么根據(jù)參考書(shū),我們看一下Python的函數(shù)是如何定義的。 def 語(yǔ)句 def語(yǔ)句將創(chuàng)建一個(gè)函數(shù)名,并且定義函數(shù)使用的變量。 函數(shù)的主體往往都含有return語(yǔ)句。 def <name> (arg1, arg2 ,..... argN ): ... return < value > 有一點(diǎn)值得說(shuō)明,python 的def語(yǔ)句并不像C語(yǔ)言定義函數(shù)一樣,def 可以在程序的任何一個(gè)位置,甚至在if 中,根據(jù)條件不同,配置不同的子函數(shù)。 我們給出一個(gè)def的使用例子。 def test(x ,y): return x*y print test(5,66) 在這里個(gè)例子中,我們定義函數(shù)test 的功能就是將兩個(gè)變量相乘。 讓我們嘗試在命令行中調(diào)用它。 我想大家已經(jīng)可以理解函數(shù)是怎么被調(diào)用的了。
那么現(xiàn)在我們看下我們的需求。
我們需要指定掃描目錄 以及保存的文件名,讓我們改一下昨天的代碼。 import os export = "" for root, dirs, files in os.walk('/media/cdrom0'): export+="\n %s;%s;%s" % (root,dirs,files) open('mycd2.cdc', 'w').write(export) 下面我們加入def import os def cdWalker (cdrom , result_file ): export = "" for root, dirs, files in os.walk(cdrom): export+="\n %s;%s;%s" % (root,dirs,files) open(result_file, 'w').write(export) 我們運(yùn)行一下,然后在命令行中調(diào)用。 我們得到了兩個(gè)文件。 如此看來(lái),我們定義的函數(shù)是沒(méi)錯(cuò)的。 那又怎么從命令行獲取輸入的參數(shù)呢。 根據(jù)書(shū)上的指引,我們使用 sys.argv 讓我們查一下sys.argv是干嘛的。 sys.argv 是用來(lái)獲取命令行的參數(shù)的。 sys.argv 的用法 我們從《Python簡(jiǎn)明教程》上取得一個(gè)例子看一下他是怎么用的。 import sys def readfile(filename): ''' Print a file to the standard output. ''' f = file(filename) while True: line = f.readline() if len(line) == 0: break print line f.close() #Script starts from here if len(sys.argv) < 2: print ' NO action specified.' sys.exit() if sys.argv[1].startswith('--'): option = sys.argv[1][2:] if option == 'version': print ' version 1.2 ' elif option == 'help': print '''This program prints files to the standard output. Any number of files can be specified. Options include: --version : Prints the version number --help : Display this help''' else: print 'Unknow option.' else: for filename in sys.argv[1:]: readfile(filename) 這個(gè)程序要從cmd里面執(zhí)行,讓我們?cè)囈幌隆?/p> 功能好像挺簡(jiǎn)單的,那么我們現(xiàn)在分析一下這個(gè)程序。 首先,我們看到了def, 它定義了一個(gè)函數(shù),這個(gè)函數(shù)從名稱(chēng)上看來(lái)是讀取文件的,參數(shù)是文件名。 下面出現(xiàn)了兩個(gè)IF , 第一個(gè)if是判斷sys.argv的長(zhǎng)度,那么我們有了一個(gè)新問(wèn)題。sys.argv得到的是什么,讓我們?cè)偕弦粋€(gè)程序上面補(bǔ)寫(xiě)一句話 print sys.argv我們看到了 sys.argv 的輸出內(nèi)容是一個(gè)list , 如果沒(méi)有 參數(shù),應(yīng)該只有一項(xiàng)。 如果有參數(shù),長(zhǎng)度肯定超過(guò)1 . 第一個(gè)if 就是解決是否提供了參數(shù)的問(wèn)題,如果沒(méi)有參數(shù),程序則退出,使用函數(shù) sys.exit( ) 第二個(gè)if 是用來(lái)判斷參數(shù)是什么??梢钥吹竭@里使用了偏移來(lái)索引字符串。 到這里,我們應(yīng)該就很清楚了 sys.argv 的實(shí)質(zhì)是什么了。
現(xiàn)在我們用 sys.argv 來(lái)修改最初的程序。
import os,sys CDROM = 'D:\\CDROM' def cdWalker (cdrom , result_file ): export = "" for root, dirs, files in os.walk(cdrom): export+="\n %s;%s;%s" % (root,dirs,files) open(result_file, 'w').write(export) if '-e'==sys.argv[1] : cdWalker (CDROM,sys.argv[2]) print "CDROM detals is saved in %s" % sys.argv[2] else: print 'ERROR INPUT !' 保存它,現(xiàn)在我們?cè)贑MD中運(yùn)行試試看。 一個(gè)可以與用戶互動(dòng)的小程序暫時(shí)完成了。 大年初一啊。>< 綠色通道 |
|
|
來(lái)自: 昵稱(chēng)QAb6ICvc > 《python》