Python Programming

Luhn-Algorithmus in Python meistern: Vier Implementierungen

Spread the love

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

Der Luhn-Algorithmus umfasst folgende Schritte:

  1. Verdoppeln Sie jede zweite Ziffer von rechts nach links.
  2. Wenn der verdoppelte Wert 9 überschreitet, subtrahieren Sie 9.
  3. Addieren Sie alle Ziffern.
  4. 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert