Der Luhn-Algorithmus ist eine einfache Prüfsummenformel zur Validierung verschiedener Identifikationsnummern, darunter Kreditkartennummern und IMEI-Nummern. Er ist ein wertvolles Werkzeug zur Aufrechterhaltung der Datenintegrität und zur Fehlererkennung bei der Eingabe. Dieser Artikel untersucht verschiedene Python-Implementierungen des Luhn-Algorithmus und zeigt verschiedene Programmierstile und deren relative Effizienz.
Inhaltsverzeichnis
- Grundlegende Implementierung
- Funktionale Zerlegung
- Iterativer Ansatz (geschachtelte Schleifen)
- Fortgeschrittene funktionale Programmierung
- Fazit
Grundlegende Implementierung
Der Luhn-Algorithmus umfasst folgende Schritte:
- Verdoppeln Sie jede zweite Ziffer von rechts nach links.
- Wenn der verdoppelte Wert 9 überschreitet, subtrahieren Sie 9.
- Addieren Sie alle Ziffern.
- Wenn der Gesamtwert modulo 10 gleich 0 ist, ist die Nummer gültig; andernfalls ist sie ungültig.
Hier ist eine einfache Python-Implementierung:
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"Ist {number1} gültig? {luhn_check(number1)}") # Ausgabe: True
print(f"Ist {number2} gültig? {luhn_check(number2)}") # Ausgabe: False
Funktionale Zerlegung
Für eine bessere Lesbarkeit und Wartbarkeit können wir den Algorithmus in kleinere, fokussiertere Funktionen zerlegen:
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"Ist {number1} gültig (funktional)? {luhn_check_functional(number1)}") # Ausgabe: True
print(f"Ist {number2} gültig (funktional)? {luhn_check_functional(number2)}") # Ausgabe: False
Iterativer Ansatz (geschachtelte Schleifen)
Ein iterativer Ansatz mit geschachtelten Schleifen ist zwar weniger effizient, bietet aber eine klarere Schritt-für-Schritt-Darstellung des Algorithmus (vor allem zu Lehrzwecken):
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"Ist {number1} gültig (iterativ)? {luhn_check_iterative(number1)}") # Ausgabe: True
print(f"Ist {number2} gültig (iterativ)? {luhn_check_iterative(number2)}") # Ausgabe: False
Fortgeschrittene funktionale Programmierung
Die Nutzung von Pythons map
und reduce
Funktionen verbessert den funktionalen Ansatz weiter:
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"Ist {number1} gültig (funktionale Programmierung)? {luhn_check_fp(number1)}") # Ausgabe: True
print(f"Ist {number2} gültig (funktionale Programmierung)? {luhn_check_fp(number2)}") # Ausgabe: False
Fazit
Dieser Artikel präsentierte verschiedene Python-Implementierungen des Luhn-Algorithmus und demonstrierte verschiedene Programmierparadigmen. Während der iterative Ansatz das Verständnis unterstützt, bieten die funktionalen Ansätze, insbesondere der fortgeschrittene, eine bessere Lesbarkeit und Effizienz für praktische Anwendungen. Denken Sie daran, dass der Luhn-Algorithmus eine Prüfsumme und keine vollständige Sicherheitslösung ist; er sollte mit anderen Validierungsmethoden verwendet werden.