Python Programming

Python实现Luhn算法四种方法

Spread the love

Luhn算法是一个简单的校验和公式,用于验证各种识别号码,包括信用卡号码和IMEI号码。它是维护数据完整性和检测输入错误的宝贵工具。本文探讨了Luhn算法的不同Python实现,展示了各种编程风格及其相对效率。

目录

基本实现

Luhn算法包含以下步骤:

  1. 从右到左,将每隔一位的数字翻倍。
  2. 如果翻倍后的值超过9,则减去9。
  3. 将所有数字相加。
  4. 如果总和模10为0,则该号码有效;否则无效。

这是一个简单的Python实现:


def luhn_check(number):
    try:
        digits = [int(d) for d in str(number)]
    except ValueError:
        return False

    odd_sum = sum(digits[-1::-2])
    even_sum = sum([sum(divmod(2 * d, 10)) for d in digits[-2::-2]])
    return (odd_sum + even_sum) % 10 == 0

number1 = 49927398716
number2 = 1234567890123456

print(f"Is {number1} valid? {luhn_check(number1)}")  # Output: True
print(f"Is {number2} valid? {luhn_check(number2)}")  # Output: False

函数分解

为了提高可读性和可维护性,我们可以将算法分解成更小、更集中的函数:


def double_digit(digit):
    return sum(divmod(2 * digit, 10))

def sum_digits(digits):
    return sum(digits)

def luhn_check_functional(number):
    try:
        digits = [int(d) for d in str(number)]
    except ValueError:
        return False
    odd_sum = sum_digits(digits[-1::-2])
    even_sum = sum_digits([double_digit(d) for d in digits[-2::-2]])
    return (odd_sum + even_sum) % 10 == 0

print(f"Is {number1} valid (functional)? {luhn_check_functional(number1)}")  # Output: True
print(f"Is {number2} valid (functional)? {luhn_check_functional(number2)}")  # Output: False

迭代方法(嵌套循环)

使用嵌套循环的迭代方法虽然效率较低,但可以更清晰地逐步说明算法(主要用于教育目的):


def luhn_check_iterative(number):
    try:
        digits = [int(x) for x in str(number)]
    except ValueError:
        return False
    total = 0
    for i in range(len(digits) - 1, -1, -1):
        if i % 2 == 0:
            total += digits[i]
        else:
            doubled = digits[i] * 2
            if doubled > 9:
                doubled -= 9
            total += doubled
    return total % 10 == 0

print(f"Is {number1} valid (iterative)? {luhn_check_iterative(number1)}")  # Output: True
print(f"Is {number2} valid (iterative)? {luhn_check_iterative(number2)}")  # Output: False

高级函数式编程

利用Python的mapreduce函数可以进一步增强函数式方法:


from functools import reduce

def luhn_check_fp(number):
    try:
        digits = list(map(int, str(number)))
    except ValueError:
        return False
    odd_sum = sum(digits[-1::-2])
    even_sum = reduce(lambda x, y: x + y, map(lambda d: sum(divmod(2 * d, 10)), digits[-2::-2]))
    return (odd_sum + even_sum) % 10 == 0

print(f"Is {number1} valid (functional programming)? {luhn_check_fp(number1)}")  # Output: True
print(f"Is {number2} valid (functional programming)? {luhn_check_fp(number2)}")  # Output: False

结论

本文介绍了Luhn算法的各种Python实现,展示了不同的编程范式。虽然迭代方法有助于理解,但函数式方法,特别是高级方法,在实际应用中具有更好的可读性和效率。请记住,Luhn算法是一种校验和,而不是完整的安全解决方案;它应该与其他验证方法一起使用。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注