�ˬd�����Ҧr��
�����Ҧr���G | |
���إ��ꪺ�����Ҧr������S�w���s�X��h�C�Ĥ@�Ӧr�O�j�g���^��r���A��l9�Ӧr�������Ʀr�A ���b�M�νs�X��h�ɡA�Ĥ@�ӭ^��r���N�|���̤U���Q�ഫ���Ʀr�G
�r�� | A | B | C | D | E | F | G | H | J | K | L | M | N |
�Ʀr | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
�r�� | P | Q | R | S | T | U | V | X | Y | W | Z | I | O |
�Ʀr | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
�ഫ�᪺�����Ҧr��(�@11��Ʀr)�C�@��Ƨ����T�w���v��(Weight)�A�ѥ����k�̧Ǭ� �y1 9 8 7 6 5 4 3 2 1 1�z�C�P�_�����Ҧr���O�_���T����k���G �U��Ʀr�P��۹������v���ۭ���A�[�`�A�[�`�᪺���G�Y��10�����ƫh�����Ҧr���Y�ݥ��T�C
�����Ҧr���W�h
�����Ҧr�����C�Ӧr���N�����N�q�p�U�G A123456789
(1) �Ĥ@�Ӧr���N���a�ϡA�ഫ�覡���G A �ഫ�� 1,0 ��Ӧr���A B �ഫ�� 1,1�K�K
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 34 | 18 | 19 | 20 | 21 | 22 | 35 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | 30 | 31 | 33 |
(2) �ĤG�Ӧr���N���ʧO�A 1 �N���k�ʡA 2 �N���k��
(3) �ĤT�Ӧr����ĤE�Ӧr�����y�����X�C
(4) �ĤQ�Ӧr�����ˬd���X�C
�ˬd�X���ͪ��W�h���G
1.
�C�Ӭ۹����Ʀr���W�v�� | �ˬd���X | ||||||||||
A | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
1 | 0 | x8 | x7 | x6 | x5 | x4 | x3 | x2 | x1 | ||
x1 | X9 | ||||||||||
2. �N���W�v�ƫᤧ�n�ۥ[
1 x 1 = 1
0 x 9 = 0
1 x 8 = 8
2 x 7 = 1 4
3 x 6 = 1 8
4 x 5 = 2 0
5 x 4 = 2 0
6 x 3 = 1 8
7 x 2 = 1 4
+) 8 x 1 = 8
------------------------------------------------
1 2 1
3. �ۥ[�ᤧ�Ȱ��H�Ҽ� 10 ����l��
1 2 1 / 1 0 = 12 �E�E�E�l�� 1
4. �ѼҼƴ�h�l�Ʊo�ˬd���X�A�Y�l�Ƭ� 0 �ɡA�h�]�w���ˬd�X�� 0
10 �V 1 = 9
檢查身分證字號
這篇文章會介紹使用 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,印出對應的結果。
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('身分證字號正確')參考:input、while、if 判斷式、break、list、讀取串列項目、for 迴圈、append 添加串列項目
加上錯誤判斷流程
雖然上述的程式已經可以檢查身分證字號,但如果使用者輸入一串奇怪的文字,例如 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('身分證字號正確')參考:例外處理 ( try、except )
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~