一个计算身份证号码校验位的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将ip地址转换成整数的方法
Mar 17 Python
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 Python
python使用MySQLdb访问mysql数据库的方法
Aug 03 Python
python3新特性函数注释Function Annotations用法分析
Jul 28 Python
Django验证码的生成与使用示例
May 20 Python
python实现简单http服务器功能
Sep 17 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
Feb 13 Python
Python eval的常见错误封装及利用原理详解
Mar 26 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
python之PyQt按钮右键菜单功能的实现代码
Aug 17 Python
python实现在多维数组中挑选符合条件的全部元素
Nov 26 Python
python 模拟登陆163邮箱
Dec 15 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 trim 去除空字符的定义与语法介绍
2010/05/31 PHP
Zend的AutoLoad机制介绍
2012/09/27 PHP
php如何调用webservice应用介绍
2012/11/24 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
php权重计算方法代码分享
2014/01/09 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
用JAVASCRIPT如何给<textarea></textarea>赋值
2007/04/20 Javascript
初学JavaScript第二章
2008/09/30 Javascript
jquery.cvtooltip.js 基于jquery的气泡提示插件
2010/11/19 Javascript
js获取页面description的方法
2015/05/21 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
浅谈javascript中的Function和Arguments
2016/08/30 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
微信小程序实现时间预约功能
2018/11/27 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
如何利用vue实现波谱拟合详解
2020/11/05 Javascript
JavaScript实现手风琴效果
2021/02/18 Javascript
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
python中pass语句用法实例分析
2015/04/30 Python
Python自动调用IE打开某个网站的方法
2015/06/03 Python
python 3.7.0 下pillow安装方法
2018/08/27 Python
python之列表推导式的用法
2019/11/29 Python
PyCharm永久激活方式(推荐)
2020/09/22 Python
经典优秀个人求职自荐信格式
2013/09/25 职场文书
怎么写有吸引力的自荐信
2013/11/17 职场文书
骨干教师培训感言
2014/01/16 职场文书
消防安全宣传标语
2014/06/07 职场文书
银行金融服务方案
2014/06/11 职场文书
教师工作自我鉴定范文
2014/09/14 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
革命电影观后感
2015/06/18 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书
Nginx解决前端访问资源跨域问题的方法详解
2021/03/31 Servers