Re: [閒聊] 身份證產生器

看板Python作者 (黑駿)時間14年前 (2011/12/17 21:25), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/4 (看更多)
※ 引述《zha0 (這個帳號是掛網用)》之銘言: : 這二天在版上一直問一些基本的問題, 其實是要寫身份證產生器(不過是某個程式的一部份) : 以下分享寫的程式碼, 如果有人有興趣, 不知可不可以再幫我把他簡化 , 感謝 . : 以前寫 C 有寫過不用查表的方式 , 用 if else if 一直在那裡判斷 A~G, H, I~... 就減多少加多少之類的 :p : 不過覺得這樣也要好幾行, 還是用查表好了, 二個 array 去代入 . : import os, sys : from random import randint, sample, choice : def chk(): : id=['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'] : num=[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] : a2n=dict(zip(id, num)) : alpha = choice(id) : r = [choice((1, 2))]+sample(range(0, 10), 7) : k = [ v*(8-i) for i,v in enumerate(r) ] : chk = (a2n[alpha]/10)+(a2n[alpha]%10*9) + sum(k) : chk = (10 - (chk % 10)) % 10 : return alpha+''.join(map(str, r))+str(chk) : if __name__ == '__main__': : for i in range(1,10): : print chk() 事實上,"對照"這件事是可以事先化簡的 ("英文部分" + "流水號部分" + "檢查碼") %10 = 0 ("英文部分"%10 + "流水號部分" + "檢查碼") %10 = 0 這兩個意思一樣 於是我可以把 10 11 12... 先"十位加個位" %10 (身分證計算法) 然後就能寫成字串 "10987654932210898765431320" 這是我的寫法: alpha = choice(range(26)) ret = [choice([1,2])] + sample(range(10),7) chk = [ v*(8-i) for i,v in enumerate(ret) ] chk = int("10987654932210898765431320"[alpha]) + sum(chk) chk = (10-chk%10) % 10 return chr(alpha+ord("A")) + ''.join(map(str,ret)) + str(chk) 其實 chk 是可以全部縮成一行的XD 不過那樣會變得很醜就是了 (如何在最短行數做到最多的事是我樂趣之一XD) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.24.33
文章代碼(AID): #1Ex9W_Dg (Python)
討論串 (同標題文章)
文章代碼(AID): #1Ex9W_Dg (Python)