用户:
一只吃瓜群众查看:7 回复:7 评论:7 创建时间:2022-11-05T16:42:22
作品链接https://shequ.codemao.cn/work/166541323,点赞支持亿下栓Q
前排警告:本期内容有点刑,食不食香精煎鱼(doge,准备好瓜子饮料矿泉水
真.前排警告:要保护好自己的个人信息哦,随便玩玩就行,不要真的把号码输进去哦
特色:可单独作为工具使用,也可作为模块(库)供被别的程序调用
单独食用时(bushi),有文字提示信息。
作为模块使用时则没有,极大程度上方便开发者的开发,避免被不知是什么玩意的提示消息气S
(虽然这个模块对开发者应该作用不大……)
ps:不知道怎么做的时候可以逝逝checode.help(),且本程序支持最后一位为X的号码进行计算哦(末X党狂喜)
正片开始
本模块采用面对对象风格的编写方法,不知道的建议在猫社和csdn逛逛
模块主要方法(函数)有两个:
import checode
obj=checode.IDcard() #前两行是准备工作,必写
a=obj.run(number) #计算验证码
b=obj.isture(number) #确定号码是否合规
第一个是用于计算最后一位的一个方法。number是字符串或者数字都可以,必须是前17位!
这个方喵返回a这个元组,注意!是元组!
元组第一项为校验码(字符串类型),第二项是完整号码,可以用切片自取
第二个是判断是否合规号码的函数,number是字符串或者数字都可以,必须18位!如果号码有X,必须字符串!
函数会返回布尔值,这么简单不用说了吧
源代码有注释,放心阅读,你一定能从中看出以下六点……
私有变量外部调用讲解:在源代码里面
没看懂/有问题在评论区里说
源代码↓
#'''欢迎使用checode库,作者:一只吃瓜群众
#本模块可自主运行,也可作为模块在其他python程序中使用!
#关于模块的使用方法,可以使用checode.help()
#示例:
#import checode
#a=checode.run(12345678901234567) #返回一个元组,第一项是校验码,第二项是完整身份证号
#print(a[0]) #参数既可以是数字,也可以是字符串
#if checode.isture(123456789012345678): #见checode.help()
#pass
#身份证校验码规则:∑(ai×Wi)(mod11)
#看不懂?没关系,我也没看懂(doge
#人话版本:将前面的身份证号码17位数分别乘以不同的系数。
#从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
#然后将这17位数字和系数相乘的结果相加,用加出来的和除以11,看余数是多少,
#余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。
#其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。
#题外话:
#有些变量与方法前会有“__”(两个下划线),这是用于表示变量或方法私有。
#ps:私有变量和方法在类外无法正常手段访问,但是有不正常手段……
#例:
#class Class():
# def __function():
# print("qwe")
##object=Class()
#在类外直接object.__function()会报错,但是……
#万能私有公式:object.__function() → object._Class__function()
#也就是把函数名改成 _类名__函数名() 注意中间没有点
#然后就没有然后了
#具体的自己上csdn搜去,好像写的有亿点多'''
l = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] #每一位的系数
num_dict = {0: '1', 1: '0', 2: 'X', 3: '9', 4: '8', 5: '7', 6: '6', 7: '5', 8: '4', 9: '3', 10: '2'}
# 余数对照表0~10分别为:1 0 X 9 8 7 6 5 4 3 2
class IDcard():
def __init__(self):
self.__a = [] #用于用户输入身份证号前17位时分割成列表
self.__b = [] #用于乘上系数之后数据的保存
def ask(self,len):#询问函数,不一定要使用这个,可以用自己的
if len==17:
return input('请输入前17位\n')
else:
return input('请输入身份证号码\n')
def __check_lenth(self,length): #检查是不是17位的
if (len(self.num) !=length):
raise ValueError('值的长度必须等于'+str(length)+',但现在的位数却是'+str(len(self.num)))#如果不是……就没有然后了
if length==18: #食不食从isture过来的
self.num=self.num[:17]
self.__group()
def __group(self): #分组
for i in range(17):
self.__a.append(int(self.num[i]))
self.__multiplication()
def __multiplication(self): #乘系数
for i in range(17):
self.__b.append(self.__a[i]*l[i])
self.__remainder()
def __remainder(self): #求和再求余
self.d = sum(self.__b) % 11
self.__pick()
def __pick(self): #按对应的数决定校验码
self.p = num_dict[self.d]
def print_info(self):
print(self.p)
print(self.num+self.p)
def run(self, number): #api接口
self.num = str(number)
self.__check_lenth(17)
return self.p, self.num+self.p
def isture(self,number):
self.num=str(number)
self.__check_lenth(18)
return self.p==number[-1]
def help():
helpmsg='''
类名:IDcard
定义对象:obj=checode.IDcard()
使用方法:
1.
var=obj.run(number)
求校验码及完整号码
参数number可为字符串或数字,长度必须为17
返回值var为一个元组,第一项(字符串)为校验码,第二项(字符串)为完整身份证号码
2.
var=obj.isture(number)
判断校验码是否合规
参数number可为字符串或数字,长度必须为18,特别提醒,如果包含X,必须用字符串!且X必须大写
返回值var为布尔值,可用在if等语句里
3.
checode.l
一个列表,每一位乘的系数
4.
checode.num_dict
一个字典,取余后,对照余数取校验码的对照字典
5.
checode.help()
啊对对对,就是你现在看的这个
如果你在看源代码,那当我没说
6.
checode.__doc__
一个变量,可以看看,源代码开头的多行字符串会被python自动保存到这个变量里
有作者随便写的亿些东西
'''
print(helpmsg)
if (__name__ == '__main__'):
idn = IDcard()
if input('获取校验码按1,验证校验码按2\n')=='1':
ans=idn.ask(17)
idn.run(ans)
idn.print_info()
else:
ans=idn.ask(18)
print(idn.isture(ans))
逝逝能不能加精,应该也许大概可能没准大约可以……吧