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

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

作者: 龙渊的宝藏 | 来源:发表于2021-04-01 13:51 被阅读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!

    向上向善,日进一步!

    每天学习,努力成长!

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

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

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

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/dnwohltx.html