在 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位身份证。