猫史档案馆


【自制模块!随时调用】《私有变量》外部竟然能调用?【身份证最后一位计算器】Checode1.0发布!

用户:一只吃瓜群众一只吃瓜群众查看: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))

逝逝能不能加精,应该也许大概可能没准大约可以……吧


回复

上一页1 页 / 共 1下一页
幻想一笑而过幻想一笑而过

很危的作品,给你留个赞吧

点赞0


评论


李土土土土土李土土土土土

利用列表和字典是可以简化的

点赞1


评论


一只吃瓜群众一只吃瓜群众

下次试着做个简化版

点赞0


评论


一只吃瓜群众一只吃瓜群众

作品链接https://shequ.codemao.cn/work/166541323,点个赞支持一下哦

点赞0


评论


一只吃瓜群众一只吃瓜群众

ddd

点赞0


评论


一只吃瓜群众一只吃瓜群众

点赞0


评论


一只吃瓜群众一只吃瓜群众

新:https://shequ.codemao.cn/work/167837020

点赞0


评论