一个计算身份证号码校验位的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实现的生成自我描述脚本分享(很有意思的程序)
Jul 18 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
详细讲解Python中的文件I/O操作
May 24 Python
python面向对象_详谈类的继承与方法的重载
Jun 07 Python
详解Django的CSRF认证实现
Oct 09 Python
Python Pandas数据中对时间的操作
Jul 30 Python
python3.6生成器yield用法实例分析
Aug 23 Python
Python 获取项目根路径的代码
Sep 27 Python
Django 框架模型操作入门教程
Nov 05 Python
Jupyter notebook如何修改平台字体
May 13 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
Nov 11 Python
python 如何在 Matplotlib 中绘制垂直线
Apr 02 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 pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
10分钟掌握XML、JSON及其解析
2020/12/06 Javascript
div实现自适应高度的textarea实现angular双向绑定
2017/01/08 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
使用python实现strcmp函数功能示例
2014/03/25 Python
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
python内置模块collections知识点总结
2019/12/19 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
Python中lru_cache的使用和实现详解
2021/01/25 Python
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
澳大利亚和新西兰最大的在线旅行社之一:Aunt Betty
2019/08/07 全球购物
印尼购物网站:iLOTTE
2019/10/16 全球购物
大学本科生的个人自我评价
2013/12/09 职场文书
葡萄牙语专业个人求职信
2013/12/10 职场文书
中层竞聘演讲稿
2014/01/09 职场文书
五年级英语教学反思
2014/01/31 职场文书
棉花姑娘教学反思
2014/02/15 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
诉讼代理人授权委托书
2014/10/11 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
2015年教师节慰问信
2015/03/23 职场文书
家装电话营销开场白
2015/05/29 职场文书
2016年教师新年寄语
2015/08/18 职场文书
golang日志包logger的用法详解
2021/05/05 Golang
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL