1 案例1:斐波那契數列
1.1 問題
編寫fib.py腳本,主要要求如下:
1.2 方案
斐波那契數列就是某一個數,總是前兩個數之和,比如0,1,1,2,3,5,8。由于輸出是一串數字,可以用清單的結構存儲。開始時,清單中有兩個值,即0,1。然後通過循環向清單中追加元素,追加元素總是清單中最後兩個元素值之和。
本例使用的是清單,不能使用元組,因為清單是一個可變類型,而元組是不可變類型。各種資料類型的比較如下:
按存儲模型分類
标量類型:數值、字元串
容器類型:清單、元組、字典
按更新模型分類:
可變類型:清單、字典
不可變類型:數字、字元串、元組
按通路模型分類
直接通路:數字
順序通路:字元串、清單、元組
映射通路:字典
由于循環次數是确定的,可以使用for循環。python中的for循環與傳統的for循環(計數器循環)不太一樣,它更象shell腳本裡的foreach疊代。python中的for接受可疊代對象(例如序列或疊代器)作為其參數,每次疊代其中一個元素。
for循環經常與range()函數一起使用。range函數文法如下:
range函數将傳回一個清單,如果清單沒有給定起始值,那麼起始值從0開始,結束值是給定的結束值的前一個值,另外還可以設定步長值。例:
當将腳本改成互動式運作時,需要注意,使用者輸入的數字,python仍然将其視為字元而不是整型數字,需要使用int()将使用者輸入做類型轉換。
在進行運算時,應使得參與運算的對象屬于同一類型,否則如果python無法進行隐匿類型轉換将會出現異常。
上面的代碼之是以出現錯誤,是因為不能将字元串與數字進行加法或拼接運算。如果希望将其拼接,可以使用下面的方式:
如果希望将其全作為數字進行相加,可以使用下面的方式:
1.3 步驟
實作此案例需要按照如下步驟進行。
步驟一:編寫固定輸出的斐波那契數列
執行結果如下:
步驟二:将腳本改為互動式執行
如果希望生成使用者指定個數的數列,需要與使用者進行互動,通過raw_input()函數讀取使用者指定的長度。因為raw_input()函數讀入的資料均為字元串,是以需要對其進行類型轉換,通過int()函數将字元串類型的數值轉換成數字類型。
為了能夠進行加法計算,需要提前擁有兩個數值。既然已經存在兩個值,那麼使用者指定數列個數後,在循環時,應該少循環兩次。
修改後的代碼如下:
腳本運作結果如下:
2 案例2:模拟cp操作
2.1 問題
編寫cp.py腳本,實作以下目标:
2.2 方案
“拷貝”一個檔案,可以想像成諒是先在目标位置建立一個空檔案,然後再将源檔案讀出,寫入到新檔案中。
在python中打開檔案的方法是open(),或者使用file(),兩個函數完全一樣可以進行互相替換。open的文法如下:
open的第一個參數是檔案名,可以是相對路徑,也可以是絕路徑。最後的一個參數是緩沖設定,預設情況下使用緩沖區。硬碟是計算機系統中最慢的一個元件,如果每産生一個字元都立即寫入磁盤,那麼這種方式的工作效率将極其低下,可以先把資料放在記憶體的緩沖區中,當緩沖區的資料比較多的時候,再批量寫入磁盤檔案。當檔案關閉的時候,緩沖區的資料也會寫入磁盤。第二個模式參數的含義如下:
打開檔案時并不消耗太多記憶體,但是将檔案内容讀到變量中,會根據讀入的資料大小消耗相應的記憶體。例:
為了防止一次性讀入大檔案消耗太多的記憶體,可以采用循環的方式,多次少量讀取資料。一般情況下可以設定每次讀取4096位元組即可。
2.3 步驟
步驟一:編寫腳本
注意,通常檔案操作有三個步驟:打開檔案,處理檔案,關閉檔案。往往被忽略的是關閉檔案,如果檔案沒有正常關閉,有可能造成資料丢失。
步驟二:通過md5值判斷新老檔案是否完全一緻
md5值是檔案的指紋資訊,如果兩個檔案的内容完全一樣,那麼其md5值一定相同,如果兩個檔案有微小的不同,其md5值也一定完全不一樣。不過檔案的權限不會影響md5值的判定。将拷貝後的目标檔案加上執行權限,就可以像原始檔案一樣的工作了。
3 案例3:生成8位随機密碼
3.1 問題
編寫randpass.py腳本,實作以下目标:
3.2 方案
假定隻使用大小寫字母和數字作為密碼,這些字元可以自己定義,不過string子產品中已有這些屬性。通過導入string子產品可以減少代碼量,同時提高效率。
這個程式的主要思路是,首先建立一個空字元串變量用于存儲密碼,然後每次在可用字元中随機選擇一個字元,再把該字元與變量中的字元進行拼接。
3.3 步驟
步驟一:編寫腳本,生成8位随機密碼
步驟二:改進腳本,生成指定位數的随機密碼
上面程式的主要問題是,第一,生成的密碼倍數是固定的,如果希望生成其他倍數的密碼,還需要重新改寫代碼;第二,如果生成密碼這個功能在其他地方也需要使用,那麼代碼的重用性得不到展現。
改進的代碼可以解以上兩個問題,具體如下:
代碼執行結果如下: