我编写了一个函数来检查企业法人的增值税号码。这个函数可以工作,但是很难看(太长太复杂)。在
我是一个新的编程Python,希望改进函数,所以我需要一些反馈和帮助。在
增值税号码总是9位数字,第一位是字符,其余的是数字。在
字符必须在letras
字符串中。在
最后一个数字是校验位。在
对于其他七个数字,算法如下:
增值税编号为1858801
代码
def validarCodigoCIF(entrada):
"""
:param: entrada: str
:rtype: bool
"""
letras = "ABCDEFGHIJKLMNPQRSVW"
if len(entrada) != 9 or entrada[0] not in letras:
return False
numero = entrada[1:10]
pares = int(numero[1]) + int(numero[3]) + int(numero[5])
impares = 0
for i in range(0, 8, 2):
j = int(numero[i]) * 2
if j < 10:
impares += j
else:
impares += j - 9
digito = str(pares+impares)[-1]
if int(digito) == 0:
checkCIF = 0
else:
checkCIF = 10 - int(digito)
# print(checkCIF)
if str(checkCIF) == entrada[-1]:
return True
else:
return False
entradaCodigoCIF = input('Enter the VAT number: ')
print(validarCodigoCIF(entradaCodigoCIF))
这是一个简短的版本
请注意以下有趣的*功能:
[1::2]
从iterable中获取所有其他项map(int, ...)
将interable中的所有项转换为整数;以及% 10
(模)可以很容易地得到数字的位数部分。在*可能不有趣
首先要解决的问题是函数太长:
这只是第一步,我想你明白了。当你有一些小的函数时,进一步的改进就更容易了。
另外,如果你用英语编写代码,这会更容易——也许人们会帮助你发现更多有意义的函数,而不仅仅是通过盲目的分区/猜测。
鉴于增值税号码使用Luhn校验和,我提出了一个我最近在an (unaccepted) answer上发布的关于信用卡号码的修改版本。
该函数不一定比您的短,但使用了另一种方法:对有效数字返回
None
,失败时返回简短的错误消息。它还可以确保首字母后面的数字是有效的,并允许使用空格和一些标点符号。Typical Programmer对Luhn校验和有一个更优雅的解决方案(尽管它应用于信用卡号码并用Javascript编写),它对奇数使用数组。
相关问题 更多 >
编程相关推荐