一个计算身份证号码校验位的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常用内置函数总结
Feb 08 Python
Python线程中对join方法的运用的教程
Apr 09 Python
python生成IP段的方法
Jul 07 Python
在Django的URLconf中使用多个视图前缀的方法
Jul 18 Python
Python3实现发送QQ邮件功能(附件)
Dec 23 Python
Python基于百度云文字识别API
Dec 13 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
Dec 18 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
Mar 26 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
利用pyecharts读取csv并进行数据统计可视化的实现
Apr 17 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
Python自省及反射原理实例详解
Jul 06 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中unserialize返回false的解决方法
2014/09/22 PHP
php实现多城市切换特效
2015/08/09 PHP
javascript css在IE和Firefox中区别分析
2009/02/18 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
Jquery中CSS选择器用法分析
2015/02/10 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
JS实现显示带倒影的图片横排居中放大展示特效实例【测试可用】
2016/08/23 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
深入理解JavaScript 参数按值传递
2017/05/24 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
Vuejs 实现简易 todoList 功能 与 组件实例代码
2018/09/10 Javascript
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
[55:54]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[03:12]TI9战队档案 - Virtus Pro
2019/08/20 DOTA
python读写ini文件示例(python读写文件)
2014/03/25 Python
python的Template使用指南
2014/09/11 Python
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
浅谈django 重载str 方法
2020/05/19 Python
详解CSS3开启硬件加速的使用和坑
2017/08/21 HTML / CSS
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
《蒙娜丽莎之约》教学反思
2014/02/27 职场文书
《夹竹桃》教学反思
2014/04/20 职场文书
2014年重阳节活动策划方案书
2014/09/16 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
校园广播稿精选
2014/10/01 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server