【问题标题】:Validate Credit Card Number Using Luhn Algorithm Python使用 Luhn 算法 Python 验证信用卡号
【发布时间】:2017-01-09 08:54:12
【问题描述】:

我正在尝试在 Python 中实现 Luhn 算法。这是我的代码

def validate(n):
    if len(str(n)) > 16:
        return False
    else:
        if len(str(n)) % 2 == 0:
            for i in str(n[0::2]):
                digit = int(str(n[i])) * 2
                while digit > 9:
                    digit = sum(map(int, str(digit)))
            dig_sum = sum(map(int, str(n)))
            return True if dig_sum % 10 == 0 else False
        elif len(str(n)) % 2 != 0:
            for i in str(n[1::2]):
                digit = int(str(n[i])) * 2
                while digit > 9:
                    digit = sum(map(int, str(digit)))
            dig_sum = sum(map(int, str(n)))
            return True if dig_sum % 10 == 0 else False

我不断收到错误

TypeError: 'int' object has no attribute '__getitem__

【问题讨论】:

  • 在 Wikipedia 页面上有一个 Python 实现,用于Luhn Algorithm.
  • n 过得怎么样?作为整数?如果是这样,请查看第一个 for 循环。那里有表达式digit = int(str(n[i])) * 2。如果n 是一个简单的整数,这将产生您的错误。在转换为字符串之前你不能索引数字
  • 要调试,打印你使用索引的变量的类型。 getitem 应该实现索引才能工作。这就是错误所说的。

标签: python algorithm


【解决方案1】:

以下是 Lunh 算法的 Python 实现,用于检测有效的信用卡号。函数将数字作为字符串并返回其信用卡是否有效。

它基于以下链接中提到的步骤:https://www.codeproject.com/Tips/515367/Validate-credit-card-number-with-Mod-algorithm

第 1 步 - 从校验位开始,每隔一个数字加倍(从右到左,每第二个数字)

第 2 步 - 如果将数字加倍得到两位数,则将数字相加得到一位数。这将产生八个个位数的数字。

第 3 步 - 现在将未加倍的数字添加到奇数位

第 4 步 - 将此号码中的所有数字相加

如果最终总和能被 10 整除,则信用卡号有效。如果不能被 10 整除,则该数无效。

def luhn(ccn):
    c = [int(x) for x in ccn[::-2]] 
    u2 = [(2*int(y))//10+(2*int(y))%10 for y in ccn[-2::-2]]
    return sum(c+u2)%10 == 0

#Test
print(luhn("49927398716"))

【讨论】:

【解决方案2】:

如果没有完整的错误信息很难判断,但很可能是因为您在放置索引和放置字符串转换的某些地方混淆了,例如:for i in str(**n[1::2]**)digit = int(str(**n[i]**)) * 2

处理它的一个好方法是创建一个临时变量n_str = str(n),并一遍又一遍地使用它而不是str(n)。

【讨论】:

    猜你喜欢
    • 2013-10-21
    • 2021-10-29
    • 2014-01-20
    • 2011-05-09
    • 2012-01-05
    • 2012-03-01
    • 2014-12-25
    • 2012-02-29
    • 2016-01-12
    相关资源
    最近更新 更多