一个计算身份证号码校验位的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 相关文章推荐
pyqt4教程之messagebox使用示例分享
Mar 07 Python
Python中使用ConfigParser解析ini配置文件实例
Aug 30 Python
python读写二进制文件的方法
May 09 Python
Python多维/嵌套字典数据无限遍历的实现
Nov 04 Python
python 二分查找和快速排序实例详解
Oct 13 Python
Flask解决跨域的问题示例代码
Feb 12 Python
浅谈django的render函数的参数问题
Oct 16 Python
Django rest framework jwt的使用方法详解
Aug 08 Python
详解Python 字符串相似性的几种度量方法
Aug 29 Python
python 调试冷知识(小结)
Nov 11 Python
Pytorch之卷积层的使用详解
Dec 31 Python
python模拟点击网页按钮实现方法
Feb 25 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
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
Yii2 queue的队列使用详解
2019/07/19 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
jQuery插件支持同一页面被多次调用
2016/02/14 Javascript
JS+Ajax实现百度智能搜索框
2017/08/04 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
js实现敏感词过滤算法及实现逻辑
2018/07/24 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
Vue解决echart在element的tab切换时显示不正确问题
2020/08/03 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
Python运算符重载详解及实例代码
2017/03/07 Python
Python简单计算数组元素平均值的方法示例
2017/12/26 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
PyQt5重写QComboBox的鼠标点击事件方法
2019/06/25 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
2020/02/20 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
css3如何绘制一个圆圆的loading转圈动画
2018/01/09 HTML / CSS
HTML5的新特性(1)
2016/03/03 HTML / CSS
部队2014年终工作总结
2014/11/27 职场文书
2015年三万活动总结
2015/03/25 职场文书
创业计划书之家教中心
2019/09/25 职场文书
给numpy.array增加维度的超简单方法
2021/06/02 Python
MySQL5.7并行复制原理及实现
2021/06/03 MySQL
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js