一个计算身份证号码校验位的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实现的检测网站挂马程序
Nov 30 Python
Python通过poll实现异步IO的方法
Jun 04 Python
编写Python CGI脚本的教程
Jun 29 Python
Python网络爬虫项目:内容提取器的定义
Oct 25 Python
python开发简易版在线音乐播放器
Mar 03 Python
Python的装饰器使用详解
Jun 26 Python
LRUCache的实现原理及利用python实现的方法
Nov 21 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
Python中使用logging和traceback模块记录日志和跟踪异常
Apr 09 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
Aug 24 Python
python字符串常规操作大全
May 02 Python
基于Python实现将列表数据生成折线图
Mar 23 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导出MySQL数据到Excel文件(fputcsv)
2011/07/03 PHP
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
2011/11/02 PHP
PHP持久连接mysql_pconnect()函数使用介绍
2012/02/05 PHP
注意:php5.4删除了session_unregister函数
2013/08/05 PHP
php header功能的使用
2013/10/28 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
2015/02/02 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
2015/02/16 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
JQuery 学习笔记 选择器之二
2009/07/23 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
2017/03/07 Javascript
react开发中如何使用require.ensure加载es6风格的组件
2017/05/09 Javascript
Node解决简单重复问题系列之Excel内容的获取
2018/01/02 Javascript
基于JavaScript实现抽奖系统
2018/01/16 Javascript
vue移动端实现手机左右滑动入场动画
2020/06/17 Javascript
Vue Components 数字键盘的实现
2019/09/18 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
实现vuex原理的示例
2020/10/21 Javascript
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
[55:11]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第一场 11.26
2020/11/30 DOTA
Django小白教程之Django用户注册与登录
2016/04/22 Python
Python selenium的基本使用方法分析
2019/12/21 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
不同意离婚代理词
2015/05/23 职场文书
小学校园广播稿
2015/08/18 职场文书
2016暑期校本培训心得体会
2016/01/08 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android
html中两种获取标签内的值的方法
2022/06/16 jQuery