任务
检查信用卡校验。
解决方案
Luhn mod 10是信用卡业检验和的标准。它不是 Python 内建的算法,不过我们可以很容易地实现这个算法:
python">def cardluhnChecksumIsValid(card_number):
'''通过 lunn mod-10 校验和算法检查信用卡号'''sum = 0num_digits = len(card_number)oddeven = num_digits & 1for count in range(num_digits):digit = int(card_number[count])if not((count & 1) ^ oddeven):digit = digit*2if digit > 9:digit = digit-9sum = sum + digit
return(sum & 10) ==0
讨论
本节代码的原型来自于Zope 中一个已经不再使用的电子商务程序。
这个程序完成的简单验证工作,可以让你避免提交一个错误的卡号给信用卡提供商,从而节省时间和金钱,因为没人愿意验证一-个错误的信用卡号。本节代码的应用面很广,因为很多政府的身份认证号码也使用了Luhn(modulus10)算法。
一个完整的信用卡验证的套件,见http://david.theresistance.net/files/creditValidation.py。如果喜欢一行代码解决问题,而不是简洁清晰的编码风格,那么我认为,(a)你可能选错了书(PerlCookbook是那种会让你满意的类型),(b)同时,在想换本书之前,瞧瞧下面这种写法能否让你高兴:
python">checksum = lambda a:( 10-sum([int(y)*[7,3,1][x%3] for x,y in enumerate(str(a)[::-1])])%10)%10