今天是Andy学Python的第37 天哦!
大家好,我是Andy。
今天试着运用所学Python知识制作身份证号码真伪判断及信息查询。
首先声明一下,本文全部为Python基础知识,包括列表、字典、函数、流程控制。文末附代码。
后期会尝试利用正则表达式优化代码,增加GUI界面、图像识别等内容,制作一个身份证号码识别与查询系统。
01.
项目需求
输入一个身份证号码,进行真伪判断,如果是正确的身份证号码,进行省份、出生年月、性别等简单信息查询。
该项目任务分解:
一是解析身份证号码;
二是制作身份证号码判断函数;
三是制作身份证号码信息查询函数;
四是制作主函数。
02.
身份证号码解析
号码长度18位,前6位分别是省、市、区行政区域代码,第7-14位是出生年月日,第15-17位是顺序码,第18位是识别检验码,其中倒数第2位是性别识别码,男单女双。
校验码的计算方法
①将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
②将这17位数字和系数相乘的结果相加。
③用加出来和除以11,看余数是多少?
④余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。
03.
身份证号码判断函数
输入身份证号码,结果显示False。仔细查看代码,未发现问题。网上求助大佬,一是指出return False可替换为其他,以便于查错;二是列表n元素为字符串,not in后面的列表为整型,不相符。
输入身份证号码验证,可验证。再将False替换回来。
04.
身份证号码信息查询函数
输入号码验证,通过,信息查询函数一次过关。
05.
主函数
06.
优化
开始设计身份证号码真伪判断时,前两位分别设定数字1-8、1-7。
这与后来查询省份的号码不相匹配,前两位应设计为全部省份号码列表。
07.
全文代码
# 判断是否是身份证号码
def isIdNumber(n):
if len(n) != 18: # 号码长度18位
return False
for i in range(16): # 前17位数字
if not n[i].isdecimal():
return False
if n[-1] not in ['0','1','2','3','4','5','6','7','8','9',"X"]: # 第18位数字或X
return False
if int(n[0:2]) not in [11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,\
41,42,43,44,45,46,51,52,53,54,50,61,62,63,64,65,83,81,82]: # 第1-2位只能是省份代码
return False
if n[6:8] not in ['19','20']: # 第7-8位只能是19,20
return False
# 校验码的计算方法
# 1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
# 2、将这17位数字和系数相乘的结果相加。
# 3、用加出来和除以11,看余数是多少?
# 4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。
a1 = int(n[0])*7
a2 = int(n[1])*9
a3 = int(n[2])*10
a4 = int(n[3])*5
a5 = int(n[4])*8
a6 = int(n[5])*4
a7 = int(n[6])*2
a8 = int(n[7])*1
a9 = int(n[8])*6
a10 = int(n[9])*3
a11 = int(n[10])*7
a12 = int(n[11])*9
a13 = int(n[12])*10
a14 = int(n[13])*5
a15 = int(n[14])*8
a16 = int(n[15])*4
a17 = int(n[16])*2
a = a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15+a16+a17
end = {0:"1", 1:"0",2:"X",3:"9",4:"8",5:"7",6:"6",7:"5",8:"4",9:"3",10:"2"}
end1 = end[a % 11]
if end1 != n[17]:
return False
print("这是一个有效的身份证号码")
# 身份证信息查询,输入一个身份证号码,查询其省份,出生年月
# 从第17位数字可以看出男女性别:奇数表示男性,偶数表示女性
def idInfo(n):
first1_2 = {11:"北京市",12:"天津市",13:"河北省",14:"山西省",15:"内蒙古自治区",
21:"辽宁省",22:"吉林省",23:"黑龙江省",
31:"上海市",32:"江苏省",33:"浙江省",34:"安徽省",35:"福建省",36:"江西省",37:"山东省",
41:"河南省",42:"湖北省",43:"湖南省",44:"广东省",45:"广西壮族自治区",46:"海南省",
51:"四川省",52:"贵州省",53:"云南省",54:"西藏自治区",50:"重庆市",
61:"陕西省",62:"甘肃省",63:"青海省",64:"宁夏回族自治区",65:"新疆维吾尔自治区",
83:"台湾地区(886)",81:"香港特别行政区(852)",82:"澳门特别行政区(853)"}
if int(n[0:2]) in first1_2:
print("你是",first1_2[int(n[0:2])] ,"人")
else:
print("这不是一个有效的身份证号码")
print("你的出生年月是"+n[6:10]+"年"+n[10:12]+"月"+n[12:14]+"日出生")
if int(n[-2]) % 2 == 0:
print("你是女士")
else:
print("你是男士")
# 主程序
n = str(input("请输入身份证号:\n"))
if isIdNumber(n) != False:
idInfo(n)
else:
print("这不是一个正确的身份证号码")
51Day Day up!
向上向善,日进一步!
每天学习,努力成长!
定个小目标,开启成长的旅程,遇见更好的自己。
这是我们和自己的约定,许诺自己不负韶华。
路虽远,行则将至;事虽难,做则必成。
成长的最好时机,就是当下。
网友评论