嘗試過很多編程語言,寫過不少程序(當然,基本上都是些自娛自樂或給自己用的工具類的小玩意兒),逐漸認識到編寫程序是一個不斷完善、不斷優化的過程——編程首先要有一個想法(目標),圍繞這個目標形成最基本的功能邏輯,測試證明功能有效之后就算目標基本實現了。隨后,可以擴展基本功能的應用領域,加強程序的容錯能力和交互性,逐漸形成一個更完善更健壯的程序。以下通過一個小例子來對此過程稍作展示:
在計算器上、電梯上、LED顯示屏上,都可以看到用點陣表示的數字
這里,我們嘗試用Python來模擬點陣數字,簡而言之,就是把數字放大(^_^)
一、設計點陣數字的顯示效果
為了簡化,我們這里只考慮0~9這十個阿拉伯數字,每個數字點陣都是5行4列,在Python中可以用tuple來表示。(在設計點陣字模的過程中,你也可以體驗一下當美工或字體設計師的感覺,@_@)。在Python中,這個過程很簡單(以下僅以0,1兩個數字為例)。
FONTCOL=4 FONTROW=5 zero=( " ** ", "* *", "* *", "* *", " ** ") one=( " * ", " ** ", " * ", " * ", " ***")
二、 測試輸出效果
為了考察數字點陣的輸出效果,也為了驗證將來的輸出邏輯,可以用一段最簡單的程序把所有字模輸出。功能邏輯很簡單:
a. 對於一個序列中的每個數字,找到其對應字模,輸出該字模的第一行,空一格;然后輸出下一個數字對應字模的第一行,空格,直到全部數字對應字模的第一行都已輸出
b. 繼續依次輸出每一行,直到結束(在本程序中是5行,即FONTROW)
完整程序:
import sys FONTCOL=4 FONTROW=5 #以下構建數字點陣 zero=(" ** ", "* *", "* *", "* *", " ** ") one= (" * ", " ** ", " * ", " * ", " ***") two= (" ** ", "* *", " * ", " * ", "****") three=(" ** ", "* *", " **", "* *", " ** ") four= (" * ", " ** ", "* * ", "****", " * ") five= ("****", "* ", "****", " *", "****") six= (" ** ", "* ", "*** ", "* *", " ** ") seven=(" ***", "* *", " * ", " * ", " ***") eight=(" ** ", "* *", " ** ", "* *", " ** ") nine= (" ** ", "* *", " ***", " *", " ** ") digits=(zero,one,two,three,four,five,six,seven,eight,nine) #將所有數字字模合成一個元組 i=0 while i<FONTROW: col=0 while col<10: #此處輸出全部字模,共計10個 print(digits[col][i],end=" ") col+=1 print("") #換行,輸出字模下一行 i+=1
輸出效果:
三、優化和完善1——根據輸入的不同,顯示不同的輸出
通過argv讀取輸入參數(即用戶想要顯示的具體數字),若用戶未提供參數,則提供使用說明和示例輸出
這里就可以把上面用到測試輸出代碼稍作調整,形成一個函數show_numbers。(注意其print部分有小調整)
核心代碼:
import sys FONTCOL=4 FONTROW=5 #以下構建數字點陣 #略 digits=(zero,one,two,three,four,five,six,seven,eight,nine) #將所有數字字模合成一個元組 def show_number(nums): i=0 while i<FONTROW: col=0 while col<len(nums): #此處輸出全部字模 print(digits[int(nums[col])][i],end=" ") col+=1 print("") #換行,輸出字模下一行 i+=1 def show_usage(): print("請在程序名之后提供15個數字以內的整數") print("程序名.py 0123456789") show_number('0123456789') if len(sys.argv)==2: show_number(sys.argv[1]) else: show_usage()#如果未提供參數或提供的參數過多,則輸出使用說明
四、優化和完善2——對輸入進行檢查
以上代碼已經可以應付基本需求了,但對於用戶的錯誤輸入沒有抵抗能力。我們計划從以下幾個方面進行優化:
a. 限制用戶的最大輸入字符個數
在DOS界面,一行最多顯示80個字符,字模每個占4字符,字模間有1字符空格,在考慮行尾的換行符,所以我們一次最多允許輸入80/(4+1)-1=15個數字。
b. 限制用戶只能輸入阿拉伯數字
如果用戶誤輸入非數字信息,如英文字符等,則int()函數會報 ValueError,抓住這個Error並做提示
調整后的程序:
try: if len(sys.argv)==2: if len(sys.argv[1])<16: show_number(sys.argv[1]) else: show_usage() else: show_usage()#如果未提供參數或提供的參數過多,則輸出使用說明 except ValueError: print("\n\n未能正確顯示全部信息!!——出現了非數字的字符!\n") show_usage()