一个计算身份证号码校验位的Python小程序


Posted in Python onAugust 15, 2014

S = Sum(Ai * Wi), i=0,.......16 (现在的身份证号码都是18位长,其中最后一位是校验位,15位的身份证号码好像不用了)

Ai对应身份证号码,Wi则为用于加权计算的值,它一串固定的数值,应该是根据某种规则得出的吧,用于取得最好的随机性,Wi的取之如下:

7   9 10 5
8   4   2   1
6   3   7   9
10  5   8   4   2

经过加权计算之后,得到一个S,用这个S去模11,取余值,然后查表得到校验位,这个索引表如下:

0 ----- 1
1 ----- 0
2 ----- x
3 ----- 9
4 ----- 8
5 ----- 7
6 ----- 6
7 ----- 5
8 ----- 4
9 ----- 3
10 ----- 2

程序代码如下:

import sys

Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7,9, 10, 5, 8, 4, 2]
IndexTable = { #此处实际是无需使用字典的,使用一个包含11个元素的数组便可,数组中存放
        0 : '1', #相应位置的号码,但是这也正好演示了Python高级数据结构的使用
        1 : '0',
        2 : 'x',
        3 : '9',
        4 : '8',
        5 : '7',
        6 : '6',
        7 : '5',
        8 : '4',
        9 : '3',
        10 : '2'
    }
No = []
sum = 0
if (len(sys.argv[1:][0]) != 17):
    print "error number"
    sys.exit()
for x in sys.argv[1:][0]:
        No.append(x)
for i in range(17):
    sum = sum + (int(No[i]) * Wi[i])
Index = sum % 11
print "So, your indicates parity is : %s" % (IndexTable[Index])

运行程序方式如下:

#python getParity.py your-indentity-number-but-except-the-last-number

我的天啊,Python内置的数据结构是如此强大而易用,越来越为之而着迷啊,继续diving~

用函数封装一下,改进的代码如下:

import sys

if __name__ != '__main__':
  print "Cannot run in module"
  sys.exit()

Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7,9, 10, 5, 8, 4, 2]
IndexTable = {
    0 : '1',
    1 : '0',
    2 : 'x',
    3 : '9',
    4 : '8',
    5 : '7',
    6 : '6',
    7 : '5',
    8 : '4',
    9 : '3',
    10 : '2'
  }

def check(identity):
  if(len(identity) == 0):
    print "please input your identity number"
    sys.exit()
  elif (len(identity[0]) != 17):
    print "error number"
    sys.exit()

def calculate(identity):
  No = []
  sum = 0
  for x in identity[0]: #这个方法是很笨拙的,直接使用No = list(identity[0])便可达到同样的目的
    No.append(x)

  for i in range(17):
    sum = sum + (int(No[i]) * Wi[i])

  Index = sum % 11
  return IndexTable[Index]

check(sys.argv[1:])
result = calculate(sys.argv[1:]) 

print "So, your indicates parity is : %s" % (result)

忘记函数原型吧,这里不需要指明返回值类型,不需要指明形参数据类型。

Python 相关文章推荐
更改Python命令行交互提示符的方法
Jan 14 Python
python通过字典dict判断指定键值是否存在的方法
Mar 21 Python
Python使用Scrapy爬取妹子图
May 28 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
Python利用Beautiful Soup模块搜索内容详解
Mar 29 Python
python字典DICT类型合并详解
Aug 17 Python
Python实现修改文件内容的方法分析
Mar 25 Python
python调用虹软2.0第三版的具体使用
Feb 22 Python
如何爬取通过ajax加载数据的网站
Aug 15 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
Sep 05 Python
深入了解Python在HDA中的应用
Sep 05 Python
解决TensorFlow程序无限制占用GPU的方法
Jun 30 Python
基于Python的身份证号码自动生成程序
Aug 15 #Python
Python异常处理总结
Aug 15 #Python
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
Aug 15 #Python
Python3基础之函数用法
Aug 13 #Python
Python3基础之条件与循环控制实例解析
Aug 13 #Python
Python3基础之基本运算符概述
Aug 13 #Python
Python3基础之list列表实例解析
Aug 13 #Python
You might like
php实例分享之html转为rtf格式
2014/06/02 PHP
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
Apache站点配置SSL强制跳转443
2021/03/09 Servers
一些不错的js函数ajax
2008/08/20 Javascript
js生成随机数之random函数随机示例
2013/12/20 Javascript
javascript动态生成树形菜单的方法
2015/11/14 Javascript
JavaScript模仿Pinterest实现图片预加载功能
2016/10/25 Javascript
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
详解easyui基于 layui.laydate日期扩展组件
2018/07/18 Javascript
LayerClose弹窗关闭刷新方法
2018/08/17 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
Python下线程之间的共享和释放示例
2015/05/04 Python
Java多线程编程中ThreadLocal类的用法及深入
2016/06/21 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
Python configparser模块配置文件过程解析
2020/03/03 Python
Python json读写方式和字典相互转化
2020/04/18 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
python适合做数据挖掘吗
2020/06/16 Python
西班牙最大的婴儿用品网上商店:Bebitus
2019/05/30 全球购物
银行学习十八大感想
2014/01/11 职场文书
劳动模范事迹材料
2014/01/19 职场文书
迎新晚会邀请函
2014/02/01 职场文书
开展读书活动总结
2014/06/30 职场文书
绘画专业自荐信
2014/07/04 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
2014年体育工作总结
2014/11/24 职场文书
公司股份合作协议书
2014/12/07 职场文书
2015年材料员工作总结
2015/04/30 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书
Go遍历struct,map,slice的实现
2021/06/13 Golang
HTML基础详解(上)
2021/10/16 HTML / CSS
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis