檢查身分證字號
這篇文章會介紹使用 Python 的字典、串列、for 迴圈、random 和 if 判斷式,做出一個身分證字號產生器。
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
基本原理
按照身分證字號編碼規則,輸入身分證字號後,先判斷是否有「十碼」,接著判斷第二碼是否為 1 或 2,最後判斷檢查碼,當三層判斷都是 True 時,表示身分證字號正確。
參考:身分證字號編碼規則
檢查身份字號
檢查身分證字號的流程如下:
- 新增一個 local_table 變數,內容是第一碼英文數字的對照表,再新增一個變數 id_number 記錄使用者輸入的身分證字號。
- 新增 check 變數為 False,和 while 迴圈搭配,待會在 while 迴圈的最後方會加入 check=True,如果執行到一半跳出 ( 身分證字號錯誤 ),check 就會是 False。
- 將英文字對應的兩位數的數字,記錄到 check_arr 變數變成兩個項目 ( 記錄為數字 ),作為最後檢查碼的判斷使用。
- 新增 sex 變數,內容是身分證字號的第二碼,判斷如果不是字串 1 也不是字串 2 ( 因為第二碼不是 1 就是 2 ),就跳出 while 迴圈。
- 最後套用第十碼檢查碼的程式,計算檢查碼是否相同,如果不相同,就跳出 while 迴圈,如果相同,最後加上 check=True,表示檢查完全正確,迴圈結束後,根據 check 的 True 或 False,印出對應的結果。
參考:input、while、if 判斷式、break、list、讀取串列項目、for 迴圈、append 添加串列項目
local_table = {'A':10,'B':11,'C':12,'D':13,'E':14,'F':15,'G':16,'H':17,'I':34,
'J':18,'K':19,'L':20,'M':21,'N':22,'O':35,'P':23,'Q':24,'R':25,
'S':26,'T':27,'U':28,'V':29,'W':32,'X':30,'Y':31,'Z':33}
id_number = input('輸入身分證字號:')
check = False # 新增 check=False 變數,與 while 迴圈搭配
while True: # 使用 while 迴圈
id_arr = list(id_number) # 新增 id_arr 變數,將身分證字號轉換成串列存入
if len(id_arr)!=10: break # 判斷如果 id_arr 長度不等於 10,就跳出 while 迴圈
local = str(local_table[id_arr[0]]) # 將對應的二位數字轉換成字串
check_arr = list(local) # 將字串轉換成陣列,例如 '10' 會轉換成 ['1','0']
check_arr[0] = int(check_arr[0]) # 將串列中的第一個項目轉換成數字
check_arr[1] = int(check_arr[1]) * 9 # 將串列中的第二個項目轉換成數字
sex = id_arr[1] # 取得第二碼數字
if sex!='1' and sex!='2': break # 判斷如果不是 '1' 也不是 '2' 就跳出 while 迴圈
check_arr.append(int(sex)*8) # 將 sex 內容轉換成數字並乘以 8,存入 check_arr 裡
for i in range(7): # 使用 for 迴圈,重複七次
check_arr.append(int(id_arr[i+2])*(7-i)) # 每次重複,按照檢查碼程式,將數字乘以對應的數值
check_num = 10 - sum(check_arr)%10 # 計算使用者輸入的檢查碼
if check_num != int(id_arr[9]): break # 如果檢查碼不相同,跳出 while 迴圈
check = True # 如果迴圈都沒有跳出,讓 check 等於 True。
break # 結束後跳出迴圈
if check == False: # while 迴圈結束後,如果 check 等於 Fasle,表示身分證字號錯誤
print('身分證字號格式錯誤')
else:
print('身分證字號正確')
加上錯誤判斷流程
雖然上述的程式已經可以檢查身分證字號,但如果使用者輸入一串奇怪的文字,例如 xyz,可能就會發生錯誤而導致程式無法運作,這時可以加入 try 和 except 做檢查和保護,如果遇到例外的狀況,就直接跳出 while 迴圈。
local_table = {'A':10,'B':11,'C':12,'D':13,'E':14,'F':15,'G':16,'H':17,'I':34,
'J':18,'K':19,'L':20,'M':21,'N':22,'O':35,'P':23,'Q':24,'R':25,
'S':26,'T':27,'U':28,'V':29,'W':32,'X':30,'Y':31,'Z':33}
while True: # 新增 while 迴圈,就可以重複輸入
id_number = input('輸入身分證字號:')
check = False
while True:
try: # 使用 try
id_arr = list(id_number)
if len(id_arr)!=10: break
local = str(local_table[id_arr[0]])
check_arr = list(local)
check_arr[0] = int(check_arr[0])
check_arr[1] = int(check_arr[1]) * 9
sex = id_arr[1]
if sex!='1' and sex!='2': break
check_arr.append(int(sex)*8)
for i in range(7):
check_arr.append(int(id_arr[i+2])*(7-i))
check_num = 10 - sum(check_arr)%10
if check_num != int(id_arr[9]): break
check = True
break
except: # 使用 except,如果發生例外狀況,跳出迴圈
break
if check == False:
print('身分證字號格式錯誤')
else:
print('身分證字號正確')
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~