如何在 Python 中使用 Luhn 算法验证数字

Luhn 算法是一种用于验证信用卡号、银行卡号等号码是否有效的算法。该算法通过对号码逐位处理后得到的数字和来判断号码的合法性。本文将介绍如何在 Python 中使用 Luhn 算法验证数字的方法。

一、算法原理

Luhn 算法的计算步骤如下:

  1. 从号码最后一位数字开始,逆向将各位数字依次取出来。
  2. 奇数位数字乘以 2 后,将得到的个位数和十位数相加(即将原数字乘以 2 的结果分别拆成两个数字)。
  3. 将奇数位数字、偶数位数字相加后,得到数字和。
  4. 如果数字和能够被 10 整除,则该号码为合法号码;否则,该号码为非法号码。

举例说明:

假设我们要验证号码 49927398716 是否合法。

步骤一:逆向取出各位数字,得到 6、1、7、8、9、3、7、2、9、9、4。

步骤二:乘以 2 得到 12、2、14、16、18、6、14、4、18、18、8,将个位数和十位数相加得到 3、2、5、7、9、6、5、4、9、9、8。

步骤三:将奇数位数字和偶数位数字相加得到 3+7+9+5+9+8=41。

步骤四:检查数字和 41 是否能够被 10 整除,因为 41 不能被 10 整除,所以该号码为非法号码。

二、Python 实现

在 Python 中,可以通过以下代码实现 Luhn 算法的验证:

def luhn_check(number):
    # 将传入的号码转为字符串,并将其逆序
    number_list = [int(i) for i in str(number)][::-1]
    # 计算奇数位数字和偶数位数字的和
    odd_sum = sum(number_list[::2])
    even_sum = sum(sum(divmod(i*2, 10)) for i in number_list[1::2])
    total_sum = odd_sum + even_sum
    # 如果数字和能够被 10 整除,则该号码为合法号码;否则,该号码为非法号码
    return total_sum % 10 == 0

将上述代码保存为 luhn.py 文件后,可以通过以下方式在 Python 中使用:

import luhn
if luhn.luhn_check(49927398716):
    print("该号码为合法号码。")
else:
    print("该号码为非法号码。")

三、注意事项

  1. Luhn 算法只能验证号码是否符合基本格式,不能验证卡片是否真实存在、是否过期、是否被冻结等信息。
  2. 在使用 Luhn 算法验证号码时,需要注意以下几点:

    (1)不要包含非数字字符,如空格、连字符等。

    (2)不要将数字顺序随意打乱。

    (3)不要使用过期或被冻结的卡片进行验证。