一笑师兄:
用实战、趣味、精炼的大白话讲Python
做Python初学者的引路之光
身份证号码其实包含了很多的逻辑规则,我们将通过一系列的身份证系列程序,深入的讲解身份证号码的每一个部分的具体含义以及数据处理方法。
知识点也将由浅入深的进行全方位的讲解。
文章末尾附带:
从这篇文章中,我们将学到如何处理字符串,进行逻辑判断以及函数的相关知识。
一 程序目标
今天的这个程序,主要实现以下三个功能:
长度检查:
判断输入的号码是否为标准的18位。
日期逻辑检查:
提取身份证中的出生年月日,判断年份、月份是否合理,甚至能自动识别闰年(比如2月是28天还是29天)。
循环交互:
程序可以反复运行,方便多次测试,直到用户手动关闭。
二 代码逐步解析
1. 身份证号码的获取与长度检查
defmain():
# 1. 获取用户输入
s = input("请输入身份证号码:")
# 2. 核验是否是18位
n = len(s)
if n != 18:
print("❌ 身份证号码位数不正确!")
return# 直接结束本次函数运行
2. 身份证出生日期的获取
# 3. 截取出生日期部分
# 字符串切片:[起始位置:结束位置],注意不包含结束位置
year = int(s[6:10]) # 第7-10位是年份
month = int(s[10:12]) # 第11-12位是月份
day = int(s[12:14]) # 第13-14位是日期
3. 出生日期的校验逻辑
# 4. 逻辑校验
# 假设合理的年份范围是1900到2026
if year > 2026or year < 1900:
print("❌ 年份不正确!")
return
elif month < 1or month > 12:
print("❌ 月份输入不正确!")
return
elif day < 1or day > getday(year, month):
# 调用刚才写的getday函数,动态获取当月最大天数
print("❌ 日期输入不正确!")
return
# 如果以上都没问题
print("✅ 身份证号码格式正确!")
4. 每个月天数的判断
defgetday(year, month):
# 定义每个月的天数列表(索引0对应1月,所以后面取值要减1)
list1 = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# 特殊处理2月
if month == 2:
# 闰年判断公式:能被4整除但不能被100整除,或者能被400整除
if year % 4 == 0and year % 100 != 0or year % 400 == 0:
return29
# 返回对应月份的天数
return list1[month - 1]
三 其他说明
1. 源代码及视频讲解
文章代码大概写明了,不知道你是否看的明白,如果看的不明白,可以看我的视频讲解,也就是我写这个程序的全过程,包括每一行代码的意思和说明。
视频地址:
https://www.bilibili.com/video/BV1y1wjzCETZ
源代码等其他信息:(或者点击阅读原文)
https://www.yxpython.com/python-id-card-check1/
2. 核验说明
现在的程序只校验了位数和出生日期。
真正的身份证校验还包含更复杂的规则,比如: 地区码校验:前6位代表省市区,是否存在?
校验码计算:
最后一位是根据前17位通过特定公式计算出来的(可能是0-9或X),将在下一篇文章进行详细讲解
3.补充说明
以后只要写程序,我尽可能边写代码边讲解,帮助更多的朋友。
如果你有什么需要写的程序、或者疑问、或者其他我可以帮助到你的,
请私信或留言告诉我。
如果此文对你有帮助,请 点个赞 !
我的小目标 --- 帮助到 10000个朋友轻松入门Python,
你的点赞,是我知道你在的最好方式 ❤️
想学什么?卡在哪?欢迎留言告诉我!