第八章例項與實戰
例項01:建立計算BMi指數的模組
建立一個用於根據身高、體重計算BMI 指數的模組,命名為 bmi.py,其中 bmi為模組名,.py為副檔名。
程式碼如下:
(1)建立一個用於根據身高、體重計算BMI指數的模組
def fun_bmi(person,height,weight): '''功能:根據身高和體重計算bmi指數 person:姓名 height:身高,單位:米 weight:體重,單位:千克 ''' print(person + "的身高" + str(height) + "米 \t 體重:" + str(weight) + "千克") bmi = weight/(height*height) print(person + "的BMI指數為:" + str(bmi)) #輸出BMI指數 # 判斷身材是否合理 if bmi < 18.5: print("您的體重過輕 ~@_@~\n") if bmi >= 18.5 and bmi <= 24.9: print("正常範圍,注意保持 (-_-)\n") if bmi >= 24.9 and bmi < 29.9: print("您的體重過重 ~@_@~\n") if bmi >= 29.9: print("肥胖 ^@_@^\n") def fun_bmi_upgrade(*person): '''功能:根據身高、體重計算BMI指數(升級版) *person:可變引數該引數中需要傳遞帶3個元素的列表, 分別為姓名、身高(單位:米)和體重(單位:千克) ''' for list_person in person: for item in list_person: person = item[0] # 姓名 height = item[1] # 身高(單位:米) weight = item[2] # 體重(單位:千克) print("\n" + "=" * 13, person, "=" * 13) print("身高:" + str(height) + "米 \t 體重:" + str(weight) + "千克") bmi = weight / (height * height) print("您的BMI指數為:" + str(bmi)) # 輸出BMI指數 # 判斷身材是否合理 if bmi < 18.5: print("您的體重過輕 ~@_@~\n") if bmi >= 18.5 and bmi <= 24.9: print("正常範圍,注意保持 (-_-)\n") if bmi >= 24.9 and bmi < 29.9: print("您的體重過重 ~@_@~\n") if bmi >= 29.9: print("肥胖 ^@_@^\n")
(2)建立一個名稱為main.py的檔案
import bmi #匯入bmi模組 bmi.fun_bmi("尹一伊",1.75,120) #執行模組中的fun_bmi()函式
執行結果如下:
例項02:匯入兩個包括同名函式的模組
建立兩個模組,一個是矩形模組,其中包括計算矩形周長和麵積的函式;另一個是圓形,其中包括計算圓形周長和麵積的函式。然後在另一個Python檔案中匯入這兩個模組,並呼叫相應的函式計算周長和麵積。
程式碼如下:
(1)建立矩形模組
#rectangle.py def girth(width, height): return (width + height) * 2 def area(width, height): return width * height if __name__ == '__main__': print(area(10, 20))
(2)建立圓形模組
#circular.py import math PI = math.pi def girth(r): return round(2*PI*r, 2) def area(r): return round(PI*r*r, 2) if __name__ == '__main__': print(girth(10))
(3)建立檔案
#compute.py import rectangle as r import circular as c if __name__ == '__main__': print("圓形的周長為: ", c.girth(10)) print("矩形的周長為: ", r.girth(10, 20))
執行結果如下:
例項03:在指定包中建立通用的設定和獲取尺寸的模組
建立一個名稱為settings的包,在該包下建立一個名稱為size的模組,通過該模組實現設定和獲取尺寸的通用功能。(1)在 settings包中,建立一個名稱為size的模組,在該模組中,定義兩個保護型別的全域性變數,分別代表寬度和高度,然後定義一個change()函式,用於修改兩個全域性變數的值,再定義兩個函式,分別用於獲取寬度和高度。(2)在settings包的上一層目錄中建立一個名稱為main.py的檔案,在該檔案中匯入.settings包下的size模組的全部定義,並且呼叫change()函式重新設定寬度和高度,然後再分別呼叫getWidth()和getHeight()函式獲取修改後的寬度和高度。
程式碼如下:
#size.py _width = 800 _height = 600 def change(w,h): global _width _width = w global _height _height = h def getwidth(): global _width return _width def getHeight(): global _height return _height
#main.py from settings.size import * if __name__ =='__main__': change(1024, 768) print('寬度: ', getwidth()) print('高度: ', getHeight())
執行結果如下:
例項04:生成由數字、字母組成的4位驗證碼
在IDLE中建立一個名稱為checkcode.py的檔案,然後在該檔案中匯入 Python標準模組中的random模組(用於生成隨機數),然後定義一個保仔驗讓碼的受裡,世片 1o書飲A乎書的哈證碼,最後輸出在該迴圈中,呼叫random模組提供的randrange()和 randint()方法生成符合要求的驗證碼,最後輸出生成的驗證碼。
程式碼如下:
import random checkcode = "" for i in range(4): index = random.randrange(0, 4) if index != i and index + 1 != i: checkcode += chr(random.randint(97, 122)) # 生成a~z中的一個小寫字母 elif index + 1 == i: checkcode += chr(random.randint(65, 90)) # 生成A~Z中的一個大寫字母 else: checkcode += str(random.randint(1, 9)) print("驗證碼:", checkcode)
執行結果如下:
實戰一:大樂透號碼生成器
使用Random模組模擬大樂透號碼生成器。選號規則為:前區在1~35的範圍內隨機產生不重複的5個號碼,後區在1~12的範圍內隨機產生不重複的2個號碼。效果如圖8.18所示。
程式碼如下:
import random def number(): a=[random.randint(1,35) for i in range(5)] list1=[] for i in a: if i not in list1: list1.append(i) else: i=random.randint(1,35) list1.append(i) list1.sort() a=[str(i) for i in list1] b=[random.randint(1,12) for i in range(2)] o=[] for i in b: if i not in o: o.append(i) else: i=random.randint(1,12) o.append(i) o.sort() b=[str(i) for i in o] c=[" "*5] for i in range(5): if len(a[i])==2: for j in range(2): if len(b[j])==2: pass else: b[j]='0'+b[j] else: a[i]='0'+a[i] g=a+c+b for i in g: print(i,end=" ") print("大樂透號碼生成器") k=int(input("請輸入要生成的大樂透號碼注數:")) for i in range(k): number() print("")
執行結果如下:
實戰二:春節集五福
最近兩年流行春節集五福活動。現程式設計實現模擬春節集五福的過程。效果如圖8.19所示。
程式碼如下:
import random # 抽五福的方法 def Ji_fu(): fus = ['愛國福', '富強福', '和諧福', '友善福', '敬業福'] fu = random.sample(fus, 1) return fu # 列印當前擁有的所有福 def fus(fu): print('當前擁有的福:') # 字典的鍵值對遍歷方法 列印福卡 for i, j in fu.items(): print(i, ':', j, '\t', end='') # 判斷是否集齊五福 def fu_ready(fu): # 設定一個集齊的標識flag,等於1表示集齊了 flag = 1 for i,j in fu.items(): if j == 0: # 有一個福卡的數量為0 flag = 0 # 標識為0,可以繼續集福 return flag print('開始集福了…………') # 定義一個五福字典 儲存使用者的福卡 fu = {'愛國福': 0, '富強福': 0, '和諧福': 0, '友善福': 0, '敬業福': 0} # 用一個while語句迴圈獲取五福,直到集齊為止 count = 0 # 設定一個計數器,記錄集福的次數 while fu_ready(fu) == 0: # 集齊標識為0 input("\n按下<enter>鍵獲取福卡:") getfu = Ji_fu()[0] # 進行抽卡 print('獲取了:', getfu) fu[getfu] += 1 # 將抽到的卡加入五福字典,相應數量+1 fus(fu) # 呼叫方法列印當前擁有的五福 fu_ready(fu) # 呼叫方法判斷是否集齊 count +=1 print("\n***五福已經集齊,真是有福之人***") print("一共集福",count,'次')
執行結果如下:
實戰三:封裝使用者的上網行為
當下很多人都會用一定的時間上網。現程式設計實現封裝使用者的上網行為,對使用者的上網時間進行統計,當上網時間過長時,給出提示。效果如圖8.20所示。
程式碼如下:
# 網頁瀏覽時間統計 def web(time): print("瀏覽網頁:"+str(time)+"小時;") return time # 看視訊時間統計 def video(time): print("看視訊:"+str(time)+"小時;") return time # 玩網路遊戲時間統計 def playgame(time): print("玩網路遊戲:"+str(time)+"小時;") return time # 上網學習時間統計 def study(time): print("上網學習:"+str(time)+"小時。") return time # 合計上網時間統計 def total(time): print('今天上網時間共計:'+str(time)+"小時,",end=' ') if time >= 8: print("請保護眼睛,合理安排上網時間!") else: print("比較合理,但也要注意休息!") name = '小明' print(name, '上網時間、行為統計……') t1 = web(1.5) t2 = video(2) t3 = playgame(3) t4 = study(2) time = t1 + t2 + t3 + t4 total(time)
執行結果如下:
實戰四:計算個人所得稅
編寫一個計算個人所得稅的程式,隨時掌握自己的工資需要繳納多少個人所得稅。效果如圖8.21所示。
程式碼如下:
# 根據月收入算個稅模組 def tax(monthmoney): # 最低起徵點3500 ds = 3500 baoxian = 7662 # 養老保險 yanglao = monthmoney * 0.08 # 醫療保險 yiliao = monthmoney * 0.02 # 失業保險 shiye = monthmoney * 0.005 # 公積金 housem = monthmoney * 0.12 # 計算三險一金總額,如超過上限按上限算 demoney = yanglao + yiliao + shiye + housem if demoney >= 7662: demoney = 7662 # 計算應徵稅額 lastmoney = monthmoney - demoney - ds # 按不同檔次徵稅,定義稅額taxes if lastmoney <= 0: taxes = 0 elif 0< lastmoney < 1500: taxes = lastmoney * 0.03 elif 1500 <= lastmoney < 4500: taxes = lastmoney * 0.1 - 105 elif 4500 <= lastmoney < 9000: taxes = lastmoney * 0.2 - 555 elif 9000 <= lastmoney < 35000: taxes = lastmoney * 0.25 - 1005 elif 35000 <= lastmoney < 55000: taxes = lastmoney * 0.3 - 2002 elif 55000 <= lastmoney < 80000: taxes = lastmoney * 0.35 - 5505 elif 80000 <= lastmoney: taxes = lastmoney * 0.45 - 13505 # if lastmoney < 0: # taxes = 0 return taxes m = float(input("請輸入您的月收入總額:")) taxes = tax(m) print('您應徵個人所得稅金額為:{:.2f} 元'.format(taxes))
執行結果如下: