Luhn算法是一个简单的校验和公式,用于验证各种识别号码,包括信用卡号码和IMEI号码。它是维护数据完整性和检测输入错误的宝贵工具。本文探讨了Luhn算法的不同Python实现,展示了各种编程风格及其相对效率。
目录
基本实现
Luhn算法包含以下步骤:
- 从右到左,将每隔一位的数字翻倍。
- 如果翻倍后的值超过9,则减去9。
- 将所有数字相加。
- 如果总和模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的map
和reduce
函数可以进一步增强函数式方法:
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算法是一种校验和,而不是完整的安全解决方案;它应该与其他验证方法一起使用。