Day037|学习Python一个月,制作身份证号码真伪及信息查

2021-04-01  本文已影响0人  龙渊的宝藏

今天是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!

向上向善,日进一步!

每天学习,努力成长!

定个小目标,开启成长的旅程,遇见更好的自己。

这是我们和自己的约定,许诺自己不负韶华。

路虽远,行则将至;事虽难,做则必成。

成长的最好时机,就是当下。

上一篇下一篇

猜你喜欢

热点阅读