题目描述 在很多场合都需要对身份证进行核验,比如现在身份证号码都是18位。其中1-6位是出生地(上户口所在地)的编码,7-14位为出生日期,15-17为序号和性别,其中第17位为偶数表示“女”,为奇数表示“男”。第18位为校验码,校验规则如下: 前17位分别乘以【7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2】 然后将17个乘积加一块取余11得到一个0-10范围的数字 0-10分别对应【1,0,x,9,8,7,6,5,4,3,2】即校验位数字 出现 x 是因为校验码为10但为了保证号码长度不变,换成了 x 请你编写一个程序,对输入的身份证号进行验证,看是否合法。用python写代码
时间: 2023-09-16 17:12:01 浏览: 138
一个计算身份证号码校验位的Python小程序
5星 · 资源好评率100%
好的,下面是Python代码:
```python
def verify_id_num(id_num):
# 判断身份证号是否为18位
if len(id_num) != 18:
return False
# 判断前17位是否都是数字
if not id_num[:17].isdigit():
return False
# 判断出生日期是否合法
birth_date = id_num[6:14]
try:
time.strptime(birth_date, "%Y%m%d")
except ValueError:
return False
# 根据校验规则,计算校验位
check_code_list = [int(id_num[i]) * [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2][i] for i in range(17)]
check_code_sum = sum(check_code_list) % 11
check_code_dict = {0:1, 1:0, 2:'X', 3:9, 4:8, 5:7, 6:6, 7:5, 8:4, 9:3, 10:2}
check_code = check_code_dict.get(check_code_sum)
# 判断校验位是否正确
if str(check_code) != id_num[-1].upper():
return False
return True
```
代码中定义了一个名为`verify_id_num`的函数,该函数接收一个身份证号码作为参数,返回一个布尔值,表示该身份证号码是否合法。
函数首先判断身份证号是否为18位,以及前17位是否都是数字,如果不满足这两个条件,直接返回`False`表示不合法。
然后判断出生日期是否合法,这里使用了Python自带的时间处理模块`time`,通过`strptime`函数将身份证号中的出生日期字符串转换为时间格式,如果转换失败则表示不合法。
接下来根据校验规则,计算校验位,将前17位数字和每一位对应的权重相乘,再将乘积相加,最后取余数即为校验位。代码中使用了一个字典`check_code_dict`来存储余数对应的校验位数字,最后判断计算得到的校验位是否与身份证号中的校验位一致,如果不一致则返回`False`表示不合法。
最后,如果所有条件都满足,则返回`True`表示身份证号码合法。
阅读全文