首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python验证

Python验证
EN

Code Review用户
提问于 2016-07-19 23:42:18
回答 2查看 11.4K关注 0票数 11

我编写了一个简单的Python验证器,我希望对它进行一些评论。

INTRO

引用维基百科的话,我们知道:

国际银行帐号(IBAN)是一种国际商定的跨国界银行账户识别系统,以便利跨境交易的沟通和处理,减少抄写错误的风险。

现在,IBAN可能如下所示: GB82WEST12345698765432

有三种算法可以验证IBAN:

  1. 验证IBAN
  2. 生成IBAN校验位
  3. IBAN的模块化操作

在我的程序中,我只使用了前两个方法。

1.验证IBAN

描述(来自维基):

通过将IBAN转换为整数并对其执行基本的mod-97操作(如ISO 7064所述),将对IBAN进行验证。如果IBAN有效,余数等于1。IBAN验证算法如下:检查IBAN总长度是否正确。否则,IBAN将四个初始字符移动到字符串的末尾,用两位数替换字符串中的每个字母,从而扩展字符串,其中A= 10,B= 11,…,Z= 35,将字符串解释为十进制整数,并在除以97上计算该数字的余数,如果余数为1,则通过检查数字测试,IBAN可能有效。示例(虚构的联合王国银行,排序代码为12-34-56,帐号98765432):·IBAN: GB82WEST12345698765432·重排: WEST12345698765432GB82·转换为整数: 3214282912345698765432161182·计算余数:3214282912123456986432161182 mod 97 =1

2.生成IBAN校验位数

描述(来自维基):

根据ECBS“IBAN的生成应由为帐户服务的银行/分行的专属责任”。8文件复制了部分ISO/IEC 7064:2003标准,作为在02至98范围内生成支票数字的一种方法。检查范围为00至96、01至97和03至99的数字也将提供IBAN的验证,但标准中没有提到是否可以使用这些范围。首选的算法是:

  1. 检查IBAN总长度是否正确,根据country.If not,IBAN是无效的。(我跳过了这个)
  2. 将两个支票数字替换为00 (例如,英国的GB00 )
  3. 将四个初始字符移到字符串的末尾。
  4. 用数字替换字符串中的字母,必要时展开字符串,使A或a= 10,B或b= 11,Z或z= 35。因此,每个字母字符替换为2位数字。
  5. 将字符串转换为整数(即忽略前导零)
  6. 计算新数字的mod-97,其结果为余数> 7。从98中减去余数,并将结果用于两个校验位数。如果结果是一个单数数字,将其插入前导0以生成一个两位数的数字。

代码(Python3)

代码语言:javascript
运行
AI代码解释
复制
letter_dic = {"A": 10, "B": 11, "C": 12, "D": 13, "E": 14, "F": 15, "G": 16, "H": 17, "I": 18, "J": 19, "K": 20,
              "L": 21, "M": 22, "N": 23, "O": 24, "P": 25, "Q": 26, "R": 27, "S": 28, "T": 29, "U": 30, "V": 31,
              "W": 32, "X": 33, "Y": 34, "Z": 35,
              "0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}

letters = {ord(k): str(v) for k, v in letter_dic.items()}


def chech_validation_chars_iban(iban):
    zeros_iban = iban[:2] + '00' + iban[4:]
    iban_inverted = zeros_iban[4:] + zeros_iban[:4]
    iban_numbered = iban_inverted.translate(letters)

    verification_chars = 98 - (int(iban_numbered) % 97)

    if verification_chars < 10:
        verification_chars = '{:02}'.format(int(verification_chars))
    return verification_chars


def validate_iban(iban):
    iban_inverted = iban[4:] + iban[:4]
    iban_numbered = iban_inverted.translate(letters)

    return int(iban_numbered) % 97


if __name__ == '__main__':
    my_iban = 'RO13RZBR0000060007134800'

    if chech_validation_chars_iban(my_iban) == int(my_iban[2:4]):
        if validate_iban(my_iban) == 1:
            print('IBAN ok!\n')
        else:
            print('IBAN nok!\n')
    else:
        print('IBAN nok!\n')

任何可能出错的建议、提示或改进都是欢迎的!

EN

回答 2

Code Review用户

回答已采纳

发布于 2016-07-20 00:36:25

我会做的改变,从上到下:

  • 使用stringenumerate来制作字典。而不是手工制作。
  • letters是一个常量,所以使用LETTERS
  • 创建一个新函数,以更改IBAN的布局并将其更改为数字。
  • chech_validation_chars_iban重命名为名称generate_iban_check_digits,因为它不是检查,而是转换。
  • 更改格式以使用字符串、{:0>2}和删除if。
  • 更改validate_iban以检查它是否有效,因此返回一个布尔值。
  • 使用and可以减少ifs的数量。

这导致:

代码语言:javascript
运行
AI代码解释
复制
import string
LETTERS = {ord(d): str(i) for i, d in enumerate(string.digits + string.ascii_uppercase)}


def _number_iban(iban):
    return (iban[4:] + iban[:4]).translate(LETTERS)


def generate_iban_check_digits(iban):
    number_iban = _number_iban(iban[:2] + '00' + iban[4:])
    return '{:0>2}'.format(98 - (int(number_iban) % 97))


def valid_iban(iban):
    return int(_number_iban(iban)) % 97 == 1


if __name__ == '__main__':
    my_iban = 'RO13RZBR0000060007134800'
    if generate_iban_check_digits(my_iban) == my_iban[2:4] and valid_iban(my_iban):
        print('IBAN ok!\n')
    else:
        print('IBAN not ok!\n')

这有一个合并问题,规范指出它既允许大写输入,也允许小写输入:

用数字替换字符串中的字母,必要时展开字符串,使A或a= 10,B或b= 11,Z或z= 35。因此,每个字母字符替换为2位数字。

然而,我们只允许大写。为了修改这一点,我会更改字母dict,使之包括小写字母。但这使得代码读起来有点困难,而不是那么干净。因此,最干净的方法可能是使用itertools.chain,使用我们现在使用的方法。

代码语言:javascript
运行
AI代码解释
复制
_LETTERS = chain(enumerate(string.digits + string.ascii_uppercase),
                 enumerate(string.ascii_lowercase, 10))
LETTERS = {ord(d): str(i) for i, d in _LETTERS}
票数 13
EN

Code Review用户

发布于 2019-06-02 01:48:19

您可以使用regex和lambda函数简化字母到数字的转换:

代码语言:javascript
运行
AI代码解释
复制
re.sub('[A-Z]', lambda m: str(ord(m.group()) - 55), (iban[4:] + iban[:4]))

翻译用一个数字的AFAIK替换字符。因此,可能不是这个IBAN用例的最佳选择。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/135366

复制
相关文章
Three TextureLoader纹理贴图不显示图片(显示黑色)的原因分析
问题在MeshLambertMaterial材质,把它改成MeshBasicMaterial即可显示图片。
Dawnzhang
2022/09/29
3.8K0
Metal Shading Language - 语法小结Metal Shading Language - 语法小结
纹理类型是一个句柄,指向一个一维/二维/三维的纹理数据;相当于OpenGL中的textureBufferID.
用户8893176
2021/08/09
1.1K0
Metal Shading Language - 语法小结Metal Shading Language - 语法小结
OpenGL学习笔记(二)——渲染管线&着色语言
导语 :渲染管线(渲染流水线),一般由显示芯片(GPU)内部处理图形信号的并行处理单元组成。这些并行处理单元两两之间相互独立。不同的型号硬件上独立处理单元的数量有很大差异。 与CPU串行执行不同,渲染
MelonTeam
2018/01/04
2.1K0
OpenGL学习笔记(二)——渲染管线&着色语言
Shader-基础纹理-遮罩纹理
遮罩纹理(mask texture)控制光照的强度,获得更加细腻的效果,通过遮罩纹理控制光照。在制作地形材质的时候混合多张图片,遮罩纹理控制如何混合这些纹理。 通过采样得到的纹素值与某种表面属性相乘,来更加精准的控制模型表面的各种属性。 在代码中添加了BumpMap来进行凹凸纹理效果,通过SpecularMask实现控制高光的光照
祝你万事顺利
2019/05/28
1.2K0
Shader-基础纹理-渐变纹理
一种基于冷暖色调的着色技术,通过渐变纹理控制漫反射光照。核心部分来说用过使用halfLambert构建一个纹理坐标,用这个纹理坐标来对渐变纹理进行采样。
祝你万事顺利
2019/05/28
1.2K0
不联网不插U盘就安全了?黑客能用声波攻击你的硬盘
《不联网不插U盘就安全了?黑客能用声波攻击你的硬盘》文章摘要:研究人员发现了一种利用声波攻击硬盘的方法,可以导致硬盘损坏和数据丢失。攻击者可以利用声波干扰机械硬盘的正常工作模式,使其产生暂时或者永久拒绝服务状态,从而阻止数据被访问。这种攻击方式需要物理接触硬盘,因此可以通过远离硬盘来避免受到攻击。研究人员建议使用加密等方法保护硬盘中的数据。
企鹅号小编
2018/01/04
1.9K0
不联网不插U盘就安全了?黑客能用声波攻击你的硬盘
WebGL2系列之采样器对象
如果我们希望从同一个图片多次读取像素信息,但是每次读取的时候使用的过滤方式不一样, 此时我们需要创建两个不同的纹理对象。
用户3158888
2019/09/09
7600
Direct3D 11 Tutorial 7:Texture Mapping and Constant Buffers_Direct3D 11 教程7:纹理映射和常量缓冲区
在上一个教程中,我们为项目引入了照明。 现在我们将通过向我们的立方体添加纹理来构建它。 此外,我们将介绍常量缓冲区的概念,并解释如何使用缓冲区通过最小化带宽使用来加速处理。
Zoctopus
2018/12/06
6080
纹理压缩
本文介绍了纹理压缩的基本概念、原理、常用压缩方式、压缩工具及相关技术标准,旨在帮助读者了解纹理压缩的基本知识,从而更好地进行纹理压缩相关的实践。
MelonTeam
2018/01/04
1.6K0
纹理压缩
12.QT-通过QOpenGLWidget显示YUV画面,通过QOpenGLTexture纹理渲染YUV
在上章11.QT-ffmpeg+QAudioOutput实现音频播放器,我们学习了如何播放音频,接下来我们便来学习如何通过opengl来显示YUV画面
诺谦
2020/11/04
3.9K0
12.QT-通过QOpenGLWidget显示YUV画面,通过QOpenGLTexture纹理渲染YUV
Pytorch的数据采样器
class torch.utils.data.Sampler(data_source)[source]
狼啸风云
2020/06/10
2K0
文字转语音,1行Python代码搞定,不联网也能用
开源项目:python-office的功能一直在更新中,今天给大家发布一个新功能:文字转语音。
程序员晚枫
2023/09/06
5220
文字转语音,1行Python代码搞定,不联网也能用
CUDA优化的冷知识18| texture和surface
https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html 来阅读原文。
GPUS Lady
2021/02/05
1.2K0
OpenGL ES _ 着色器_纹理图像
玩过游戏的同学们,都知道在游戏人物身上穿的那个叫皮肤,专业点将那个就叫做纹理图像。GLSL 支持在顶点和片段着色器使用纹理图像。
酷走天涯
2018/09/14
1.3K0
Shader-高级纹理-立方体纹理
是环境映射(EnvironmentMapping)一种实现方式。 纹理采样:对立方体采样需要提供一个三维的纹理坐标,这个三维纹理坐标表示了我们在世界空间下的一个3D、方向。
祝你万事顺利
2019/05/29
9010
Qt官方示例-字体采样器
❝预览系列字体的例子。❞   建立字体树显示。 QFontDatabase database; fontTree->setColumnCount(1); fontTree->setHeaderLabels(QStringList() << tr("Font")); foreach (QString family, database.families()) { const QStringList styles = database.styles(family); if (styles.i
Qt君
2023/03/17
4170
Qt官方示例-字体采样器
OpenGL(八)--纹理相关APIOpenGL(八)--纹理相关API
OpenGL(八)--纹理相关API 1. 原始图像数据 //存储图像数据所占内存大小 size = 图像的高度 * 图像的宽度 * 每个像素所占字节数 像素所占字节数:一般为4Byte,包含RGBA四个通道,每个通道为1Byte(8Bit) 2. 认识函数 像素存储方式 //改变像素存储方式 void glPixelStorei(GLenum pname,GLint param); //恢复像素存储方式 void glPixelStoref(GLenum pname,GLint param); /
用户8893176
2021/08/09
1.2K0
OpenGL(八)--纹理相关APIOpenGL(八)--纹理相关API
Metal入门教程总结
本文介绍Metal和Metal Shader Language,以及Metal和OpenGL ES的差异性,也是实现入门教程的心得总结。
落影
2018/08/21
5.1K0
Metal入门教程总结
纹理投影测试
GPU Gems3里有个不规则地形(X,Y,Z三个方向上都有面), 这时就没法简单地用X,Z坐标来计算UV了
逍遥剑客
2019/02/20
6630
点击加载更多

相似问题

采样器不包扎纹理

12

纹理采样器ID不映射到纹理单元

27

绑定OpenGL纹理采样器

10

对纹理采样器纹理单位值的困惑

13

纹理对象和采样器的多重纹理化理论

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档