【问题标题】:Python: Credit Card Validation Code [closed]Python:信用卡验证码 [关闭]
【发布时间】:2025-12-31 01:30:06
【问题描述】:

我的代码有问题。 它运行得很好,但在某些情况下(例如 input=8913266562747895)它给出了错误的答案。 这是我的代码:

def ccv(s):
    k=list(s)
    if len(k)==19:
        for i in(0,1,2,3,5,6,7,8,10,11,12,13,15,16,17,18):
            if not k[i].isdigit():
                return False
        for i in(4,9,14):            
            if k[i]!=" " and k[i]!="-":
                return False
        l=[int(c) for c in s if c.isdigit()]
        if not 4<=l[0]and l[0]<=7:
            return False
        s=0
        for i in range(0,16, 2):
            l[i]=2*l[i]
            if l[i]/10!=0:
                l[i]= l[i]/10+(l[i]%10)       
        for i in range(16):
            s=s+l[i]
        return s%10==0
    elif len(k)==16:
        for i in range(16):
            if not k[i].isdigit():
                return False
        l=[int(c) for c in s if c.isdigit()]
        if not 4<=l[0]and l[0]<=7:
            return False
        else:          
            s=0
            for i in range(0,16, 2):
                    l[i]=2*l[i]
                    if l[i]/10!=0:
                        l[i]= l[i]/10+(l[i]%10)       
            for i in range(16):
                    s=s+l[i]
        return s%10==0
    else:
        return False
n=raw_input()
while n!="END" and n!="end":
    print ccv(n)
    n=raw_input()

你能告诉我问题出在哪里吗?

【问题讨论】:

  • 这种代码有助于将其分解为较小的函数,每个函数检查一个状态,或者(甚至更好)使用有助于 CC 验证的库。
  • 为什么不使用regex for such matters
  • 请描述“错误答案”的组成。举例输入输出;解释你对问题的理解。
  • @damienfrancois:因为正则表达式无法计算校验位(我认为这段代码正在这样做)。
  • 您的测试编号 8913266562747895 should in fact return True。请记住,即使您组成一个完全随机的 16 位数字,它也有十分之一的机会“有效”,即具有正确的控制和。

标签: python validation


【解决方案1】:

我认为您正在寻找的是Luhn algorithm。它可以非常简洁地实现,如下所示:

def luhn(input):
    digits = [int(c) for c in input if c.isdigit()]
    checksum = digits.pop()
    digits.reverse()
    doubled = [2*d for d in digits[0::2]]
    total = sum(d-9 if d > 9 else d for d in doubled) + sum(digits[1::2])
    return (total * 9) % 10 == checksum

Rosetta Code - Luhn Algorithm 有一个更短的版本,但可能不太可读。

PayPal 发布了一个很好的 list of fake credit card numbers 进行测试。

同时检查pycard,一个没有外部依赖的库。

【讨论】:

  • 我试过了。它不起作用
  • 你的代码说:long' object is not iterable
  • @GeorgeDavidKing: "以字符串形式获取信用卡号"
  • 好的。但是现在它显示另一个错误:文件“my_code.py2”,第 11 行,in print luhn(n) 文件“my_code.py2”,第 5 行,在 luhn 数字 = [int( c) for c in n] ValueError: invalid literal for int() with base 10: '-'
  • 我也有一个错误,我已经发布了我认为正确的 Rosetta 代码版本。
【解决方案2】:

一个问题是这一行(以及else 块中的重复行):

if not 4<=l[0]and l[0]<=7:
    return False

您需要使用括号使其以正确的方式解析:

if not (4<=l[0]and l[0]<=7):
    return False

更好:

if not 4 <= l[0] <= 7:
    return False

【讨论】:

  • 还是错了。自己试试。输入=8913266562747895 输出=真
  • @GeorgeDavidKing:你没有修复两个if 语句。
  • 哈哈哈哈哈哈!!!好的!非常感谢。你真是个救命恩人!
  • @AndréLaszlo:我认为 OP 不会检查实际的信用卡号码。
  • @blender,希望不是 :)