18位身份证校验Python

18位身份证号码的校验(Python)

  1. 在 Python 中,可以使用更简单的方法来计算校验码。例如,可以使用 map() 和 lambda 表达式来将身份证号的前17位转换为整数列表,如下所示:

    nums = list(map(int, code[:17]))

然后,可以使用 numpy 库中的 dot() 函数来计算加权和,如下所示:

s = np.dot(nums, [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2])

最后,可以使用一个简单的表达式来计算校验码:

cd = (12 - s % 11) % 11

Python代码示例

import numpy as np

while True:
    id_number = input("请输入18位身份证号:")
    if len(id_number) != 18 or not id_number[:-1].isdigit() or id_number[-1] not in ['X', 'x', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']:
        print("请输入正确的身份证号!")
    else:
        break

# 计算校验码
nums = list(map(int, id_number[:17]))
weighted_sum = np.dot(nums, [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2])
check_code = (12 - weighted_sum % 11) % 11

# 判断校验码是否正确
if (id_number[-1].upper() == 'X' and check_code == 10) or (check_code == int(id_number[-1])):
    # 输出地址码
    area_code = id_number[:6]
    print("地址码:{}".format(area_code))

    # 输出生日
    birthday = id_number[6:14]
    print("生日:{}年{}月{}日".format(birthday[:4], birthday[4:6], birthday[6:8]))

    # 输出性别
    gender_code = int(id_number[16])
    if gender_code % 2 == 0:
        gender = "女"
    else:
        gender = "男"
    print("性别:{}".format(gender))

    # 输出校验码
    print("校验码:{}".format(check_code))
    
    # 输出校验结果
    print("校验结果:正确")
else:
    print("校验结果:错误")

代码中添加的功能包括:

  • 输出身份证的地址码,即前6位;
  • 输出身份证的生日,即第7位到第14位;
  • 输出身份证的性别,即第17位;
  • 输出身份证的校验码,即最后一位(如果校验成功)。

注意,为了简化代码,性别的判断仅适用于18位身份证,不适用于15位身份证。

posted @ 2023-03-07 16:54  Athenavi  阅读(562)  评论(0编辑  收藏  举报