身份证验证程序(一)

身份证号码验证(一)——面向对象 身份证号码的验证我们在网上已经能够看到很多的代码了,相关的资料也有很多。但是很多都是用面向过程的方法来编写的,今天我们换一种思路用面向对象的方法来编写这个程序。 在编写一个程序之前我们要首先要学会调研。那么在这个程序中我们要首先了解的是身份证号码校验的条件是什么。因为这是第一版本我们的条件很简单,就是简单的用校验码来校验一个身份证号码是否正确。 身份证号码的编排有一定的规则,身份证号码一共是18位,其中最后一位为校验位。前十七位分别于相对应的加权系数相乘,其中加权系数W = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2],并求出他们的和与11求余数,并将余数与对应的校验码匹配ID_CHECK = [‘1’, ‘0’, ‘X’,‘9’, ‘8’, ‘7’, ‘6’, ‘5’, ‘4’, ‘3’, ‘2’]。如果求得余数为2,则身份证的最后一位就是‘X’,以此类推。通过python中的for循环,将列表id_num的前十七位分别于加权系数中的W中的十七位加权系数相乘,并将结果保存在变量ID_aXw中,将ID_aXw与11求余数,通过余数找出相应的校验码。最后通过if循环判断身份证的最后一位与通过函数求得的校验码是否相同。若不同则终止程序,若相同则继续执行。 当然在显示生活中我们应该考虑的东西有很多比如身份证中的年龄是不能够大于当前日期的等等条件。今天我们就先来一个简单点的,只考虑身份证的校验规则。这也就是调研的重要性,如果说大家在设计程序之前没有考虑到这个问题,那么这个程序就存在很大的漏洞,因此我们强调调研的重要性。 废话不多说我们开始程序的设计。在这个程序中我分成3个模块:1、设计一个函数用于输入18位数字,2、设计一个函数用于判定身份证号是否正确,3、设计一个函数用于提取身份证中的相关信息。系统模块图输入模块

def __InPut_Id(self):
“”"
该函数用于输入身份证号码,并根据身份证号位数初步判定输入的是否正确
“”"
id_num = input('请输入18位身份证号码: ')
# 对身份证号码的位数进行判定,如果长度不足18为循环调用_InPutID()函数,直到位数为18位
if len(id_num) != 18:
print(“错误:身份证号码的位数不是18位!”)
# 如果该身份证号码是错误的那么直接退出程序
exit()
else:
print(“您输入的身份证号码是:” + id_num)

return id_num

这个程序中会输入一个18位的字符串,如果输入字符串的长度不是18的话程序会直接退出。

判定模块
def __Check_Id(self, ID):
“”"
本函数根据身份证号码的编码规则用于对输入的身份证号码进行判定是否正确

"""
# 将身份证号码的最后一位(校验位)保存在变量ID_check中
ID_check = ID[17]
# 定义一列表W用于存储身份证号码校验的加权系数
W = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
# 定义一个常量列表用于存储相对应的身份证最后一位的数
ID_CHECK = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
# 定义一个变量用于存放身份证的前十七位与其加权系数乘积的和
ID_aXw = 0
# 利用for循环来求和
for i in range(len(W)):
    ID_aXw = ID_aXw + int(ID[i]) * W[i]
m = ID_aXw % 11
print("余数为:"+str(m))
# 如果由公式求出来的身份证号码和输入的身份证号码不一致则再次调用_InPutID()函数重新输入
if ID_check != ID_CHECK[m]:
    print("错误:您输入的身份证号码不正确!")
    # 若输入的身份证号码是错误的那么直接退出程序
    exit()
else:
    print("您输入的身份证号码是正确的身份证号码")
    这个模块中会对身份证号码进行判定如果判定身份证好慢吧不正确则退出程序
    ****信息提取模块****
    def __Extract_Id(self, ID):
"""
如果输入的身份证号码是正确的那么提取其中的性别,出生日期等信息

"""
Id_Birth = ID[6:14]
ID_Sex = ID[16]
year = Id_Birth[0:4]
month = Id_Birth[4:6]
day = Id_Birth[6:8]
print("出生日期:" + year + "年" + month + "月" + day + "日")
if int(ID_Sex) % 2 == 0:
    print("性别:女")
else:
    print("性别:男")
    在这个程序中用索引的方式,将列表中的出生日期和性别提取出来。
  下面附上整个程序。
  """

日期:2019年9月15日
程序名:IdCard.py
功能:输入一个身份证号码,检测是否正确并提取出出生日期和性别信息
算法:
参数:1.id_num -输入的身份证号码
2.ID_check -用于存储输入身份证号码的最后一位
3.W -用于存放加权系数
4.ID_CHECK -用于存放规定的校验码
]
5.ID_aXw -用于存放输入身份证号码与加权系数的乘积

“”"

class CheckIdCard:
“”"
设计一个身份证验证号码验证类主要有四个函数组成
1、_InPutID():输入函数,用于输入一个身份证号码并根据输入的身份证号码位数初步检测是否正确
2、_CheckID():判定函数,根据身份证号规则判断身份证号是否正确
3、_ExtractId():信息提取输出函数,从身份证号码中提取出生日期和性别
4、go():外部接口,通过go()函数实现访问CheckIdCard类中的私有函数
“”"

def __InPut_Id(self):
    """
   该函数用于输入身份证号码,并根据身份证号位数初步判定输入的是否正确
   """
    id_num = input('请输入18位身份证号码: ')
    # 对身份证号码的位数进行判定,如果长度不足18为循环调用_InPutID()函数,直到位数为18位
    if len(id_num) != 18:
        print("错误:身份证号码的位数不是18位!")
        # 如果该身份证号码是错误的那么直接退出程序
        exit()
    else:
        print("您输入的身份证号码是:" + id_num)

    return id_num

def __Check_Id(self, ID):
    """
    本函数根据身份证号码的编码规则用于对输入的身份证号码进行判定是否正确

    """
    # 将身份证号码的最后一位(校验位)保存在变量ID_check中
    ID_check = ID[17]
    # 定义一列表W用于存储身份证号码校验的加权系数
    W = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    # 定义一个常量列表用于存储相对应的身份证最后一位的数
    ID_CHECK = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    # 定义一个变量用于存放身份证的前十七位与其加权系数乘积的和
    ID_aXw = 0
    # 利用for循环来求和
    for i in range(len(W)):
        ID_aXw = ID_aXw + int(ID[i]) * W[i]
    m = ID_aXw % 11
    print("余数为:"+str(m))
    # 如果由公式求出来的身份证号码和输入的身份证号码不一致则再次调用_InPutID()函数重新输入
    if ID_check != ID_CHECK[m]:
        print("错误:您输入的身份证号码不正确!")
        # 若输入的身份证号码是错误的那么直接退出程序
        exit()
    else:
        print("您输入的身份证号码是正确的身份证号码")

def __Extract_Id(self, ID):
    """
    如果输入的身份证号码是正确的那么提取其中的性别,出生日期等信息

    """
    Id_Birth = ID[6:14]
    ID_Sex = ID[16]
    year = Id_Birth[0:4]
    month = Id_Birth[4:6]
    day = Id_Birth[6:8]
    print("出生日期:" + year + "年" + month + "月" + day + "日")
    if int(ID_Sex) % 2 == 0:
        print("性别:女")
    else:
        print("性别:男")

def go(self):
    """
    go()函数的作用是用来充当一个外部接口,实例可以通过本函数来访问CheckIdCard类中的
    私有函数

    """
    ID = self.__InPut_Id()
    self.__Check_Id(ID)
    self.__Extract_Id(ID)

# 创建一个实例并调用go()函数
Id = CheckIdCard()
Id.go()

本程序是应用面向对象编写的,所以首先创建一个CheckIdCard:类,然后在类下面定义4个函数。前三个已经介绍过了。最后一个函数是做什么的呢?最后一个函数相当于一个外部接口的作用。因为前三个函数我定义成了私有函数,所以我们用类创建的实例是无法访问到的,因此我们单独创建一个函数用于前三个函数。这样做有什么好处呢,可以防止外部的对象来调用类中的函数,保证了程序的私密性。
后续会陆续更新更详细的版本。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值