Python入门实战:身份证信息核验 2

这篇文章,我们继续写身份证的信息核验。

Python入门实战:手把手教你写“身份证信息核验”

上一篇文章,我们已经写了出生日期的相关的核验,这部分我们讲最后的核验码是如何核验的。

一 程序目标

  • 判断前17位是否全是数字
  • 计算并判断第18位的校验码是否正确

二 程序知识点

  • 字符串切片索引,以及常用命令,如isdigit
  • 列表的遍历与读取。
  • 字典的创建与读取。

三 程序代码

下面的代码是在上篇文章的基础上增加的

    # 判断前17位是否全是数字
    if not s[:18].isdigit():
        print("前17位不全是数字!")
        return
Python
#判断第18位的校验码
    list1 = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
    # 计算前17位的和
    sum1 = 0
    for i in range(17):
        sum1 += int(s[i]) * list1[i]
    m = sum1 % 11 #求余数

    dict1 = {
        0:'1',1:'0',2:"X",3:'9',4:'8',5:'7',6:'6',7:'5',8:'4',9:'3',10:'2'
    }
    
    if s[-1] != dict1[m]:
        print("第18位校验码不正确!")
        return
    
    print("身份证号码正确!")
Python

全部源代码

'''
# 判断前17位是否全是数字
顺序码,第 17 位用于区分性别,奇数代表男性,偶数代表女性。
第18位,校验码
'''
def getday(year,month):
    list1 = [31,28,31,30,31,30,31,31,30,31,30,31]
    if month==2:
        if year%4==0 and year%100!=0 or year%400==0:
            return 29
    return list1[month-1]

def main():
    # 输入身份证号码
    s = input("请输入身份证号码:")

    # 核验是否是18位
    n = len(s) 
    if n!=18:
        print("身份证号码位数不正确!")
        return
    
    # 判断前17位是否全是数字
    if not s[:18].isdigit():
        print("前17位不全是数字!")
        return
    
    # 判断出生日期是否正确!
    year = int(s[6:10])
    month = int(s[10:12])
    day = int(s[12:14])

    if year>2026 or year<1900:
        print("年份不正确!")
        return 
    elif month<1 or month>12:
        print("月份输入不正确!")
        return 
    elif day<1 or day>getday(year,month):
        print("日期输入不正确!")
        return 

    #判断第18位的校验码
    list1 = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
    # 计算前17位的和
    sum1 = 0
    for i in range(17):
        sum1 += int(s[i]) * list1[i]
    m = sum1 % 11 #求余数

    dict1 = {
        0:'1',1:'0',2:"X",3:'9',4:'8',5:'7',6:'6',7:'5',8:'4',9:'3',10:'2'
    }
    
    if s[-1] != dict1[m]:
        print("第18位校验码不正确!")
        return
    
    print("身份证号码正确!")
# 112233200010108901
while True:
    main()
Python

四 视频讲解

程序的编写过程和讲解见下面链接

Python基础练习:身份证号码核验

https://www.bilibili.com/video/BV1y1wjzCETZ

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注