python
网站首页 |   



  • python 1行代码1个程序风格之:18位身份证号码校验码算法
  • 发布: 江湖程序员 来源: 本站原创 时间: 2024/08/30 12:11
    (4157) 点赞: (148) 标签: 功底课程


    1行代码1个程序
      python 1行代码1个程序,代码可以连成一行,且代码中不包含分号、for、while、if、else等常规语法,取而代之的是lambda、and、or等,使之更加晦涩难以解读,虽有悖于pep08规范,但也是别具一格!

    """
    二代身份证校验码说明:
    身份证18位分别代表的含义,身份证15位升级到18位,原来年用2位且没有最后一位,从左到右方分别表示
    ①1-2 升级行政区代码
    ②3-4 地级行政区划分代码
    ③5-6 县区行政区分代码
    ④7-10 11-12 13-14 出生年、月、日
    ⑤15-17 顺序码,同一地区同年、同月、同日出生人的编号,奇数是男性,偶数是女性
    ⑥18 校验码,如果是0-9则用0-9表示,如果是10则用X(罗马数字10)表示
    """
    
    #“一行代码一个程序”的代码构建过程、 蜕变如下:
    
    #①计算2的n次方的结果
    print((lambda a,b,c,d = lambda x,y,z,f,z1 = []:x != -1 and f(x-1,2**x,z1.append(y),f) or z1[1:]:d(a,b,c,d))(17,2,0))
    
    #②计算加权因子:
    print((lambda a,b,c,d = lambda x,y,z,f,z1 = []:x != -1 and f(x-1,2**x,z1.append(y%11),f) or z1[1:]:d(a,b,c,d))(17,2,0))
    
    #③用每个号码分别 * 加权因子
    print(
        (lambda i:(
                (lambda a,b,c,d = lambda x,y,z,f,z1 = []:
                 x < 17 and f(x+1,y,z1.append(int(y[x])*z[x]) or z,f) or z1:d(a,b,c,d))
             )(
            0, i, (lambda a,b,c,d = lambda x,y,z,f,z1 = []:x != -1 and f(x-1,2**x,z1.append(y%11),f) or z1[1:]:d(a,b,c,d))(17,2,0))
         )('12345678901234567')
    )
    
    #④用每个号码分别 * 加权因子、并求和:
    print(
        repr(
            (lambda i:(
                    (lambda a,b,c,d = lambda x,y,z,f,z1 = type('z1', (int,), {'__init__': lambda self, value: setattr(self, '_value', value), '__iadd__': lambda self, other: setattr(self, '_value', self._value + other), '__repr__': lambda self: str(self._value)})(0):
                     x < 17 and f(x+1,y,z1.__iadd__(int(y[x])*z[x]) or int(z1) or z,f) or z1:d(a,b,c,d))
                 )(
                0, i, (lambda a,b,c,d = lambda x,y,z,f,z1 = []:x != -1 and f(x-1,2**x,z1.append(y%11),f) or z1[1:]:d(a,b,c,d))(17,2,0))
             )('12345678901234567')
        )
    )
    
    #⑤将计算结果与11求余,然后再取出[校验码对照表]中对应的值即可:
    print(
        (lambda d,s:d.get(int(s)%11, 'null'))(
            {0:1,1:2,2:'X',3:9,4:8,5:7,6:6,7:5,8:4,9:3,10:2},
            repr(
                    (lambda i:(
                            (lambda a,b,c,d = lambda x,y,z,f,z1 = type('z1', (int,), {'__init__': lambda self, value: setattr(self, '_value', value), '__iadd__': lambda self, other: setattr(self, '_value', self._value + other), '__repr__': lambda self: str(self._value)})(0):
                             x < 17 and f(x+1,y,z1.__iadd__(int(y[x])*z[x]) or int(z1) or z,f) or z1:d(a,b,c,d))
                         )(
                        0, i, (lambda a,b,c,d = lambda x,y,z,f,z1 = []:x != -1 and f(x-1,2**x,z1.append(y%11),f) or z1[1:]:d(a,b,c,d))(17,2,0))
                     )('12345678901234567')
                )
        )
    )
    输出结果:
    [131072, 65536, 32768, 16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2]
    [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    [7, 18, 30, 20, 40, 24, 14, 8, 54, 0, 7, 18, 30, 20, 40, 24, 14]
    368
    7
    >>> 
    

    作者:江湖程序员 (python帮助网)
    转载请注明出处: www.pythonhelp.cn


    ---= 已经到底 =---