Validar números usando el algoritmo de Luhn en Python
- Validar números usando el algoritmo de Luhn en Python
- Usar funciones para validar números a través del algoritmo de Luhn
- Use bucles anidados para validar números a través del algoritmo de Luhn
- Use la programación funcional para validar números a través del algoritmo de Luhn
- Conclusión
 
El informático alemán Hans Peter Luhn desarrolló la fórmula del algoritmo de Luhn en la década de 1960. Es un algoritmo de suma de verificación utilizado por las principales organizaciones financieras internacionales de transferencia electrónica de fondos como Visa y Master Card para acelerar los pagos y transacciones en línea.
Este artículo explica cómo escribir el algoritmo de Luhn en Python y valida los números según el algoritmo.
Validar números usando el algoritmo de Luhn en Python
El validador del algoritmo de Luhn ayuda a examinar y separar los números legítimos de las entradas incorrectas o mal escritas. Para saber más al respecto, consulte este enlace.
Comprendamos cómo crear un programa que valide números usando el algoritmo de Luhn en Python.
Usar funciones para validar números a través del algoritmo de Luhn
Este programa toma un número y lo valida usando el algoritmo de Luhn en Python. El programa tiene tres métodos: separate_digits(), luhn_algo() y check_if_valid.
Descripción paso a paso:
- 
La primera línea de código crea un método luhn_algocon un parámetronum.
- 
Dentro del método, se crea otro método anidado, separate_digits(). Este método anidado separa los dígitos del número que se le pasa y devuelve los números separados como una lista de Python.El método usa un bucle forpara iterar los dígitos dentro de la lista.def luhn_algo(num): def separate_digits(n): return [int(d) for d in str(n)]
- 
Una nueva variable, digits, utiliza el métodoseparate_digitspara convertir los valores dentro denumen una lista de dígitos.digits = separate_digits(num)
- 
Una vez que los dígitos se almacenan en una lista de Python, la lista debe invertirse y los dígitos pares e impares deben separarse. Esto se logra utilizando el operador de corte ::.Por ejemplo, en la sintaxis odd_digits = digits[-1::-2],-1::invierte la lista y toma el primer índice.El ::-2recoge cada segundo elemento a partir del primer índice. Esto crea una nueva lista con solo dígitos impares.Del mismo modo, la lista de dígitos pares se crea utilizando el operador -2::-2.digits = separate_digits(num) odd_digits = digits[-1::-2] even_digits = digits[-2::-2]
- 
El algoritmo de Luhn suma los dígitos impares, mientras que los dígitos pares se suman después de multiplicarlos por 2. Si el producto de cifras pares es mayor que 9, se suma la suma de sus cifras. Por último, se suman todos los dígitos pares e impares. Se crea una variable checksumpara sumar todos los dígitos. La suma de dígitos impares se calcula usando la sintaxis:checksum += sum(odd_digits)Se crea un bucle forpara iterar la lista de dígitos pares. De esta manera, cada dígito se multiplica por2, y luego el métodoseparate_digitssepara los dígitos del producto, y luego se calcula su suma.Por último, se añade a la variable checksum.
```python
for d in even_digits:
    checksum += sum(separate_digits(d * 2))
```
- 
Un número para ser validado por el algoritmo de Luhn, su producto final debe ser divisible por 10. El valor del resultado se devuelve al final del método. return checksum % 10
- 
Para validar el resultado del algoritmo de Luhn se crea un método check_if_validcon un parámetronum. El método comprueba si el resultado devuelto por el métodoluhn_algoes igual a cero utilizando los operadores de equidad y devuelve el resultado.def check_if_valid(num): return luhn_algo(num) == 0
- 
Para imprimir los resultados, se pasa un número al método check_if_valid, y se imprimen los resultados.
Código:
def luhn_algo(num):
    print("Number = ", num)
    def separate_digits(n):
        # Separates digits of num and stores them in a python list
        return [int(d) for d in str(n)]
    digits = separate_digits(num)
    # Creates a new reversed list with just odd digits
    odd_digits = digits[-1::-2]
    # Creates another reversed list with even digits
    even_digits = digits[-2::-2]
    checksum = 0
    checksum += sum(odd_digits)  # Finds sum of odd digits
    for d in even_digits:
        checksum += sum(
            separate_digits(d * 2)
        )  # Multiplies even digits with 2 and sums digits > 9
    return checksum % 10
def check_if_valid(num):
    return luhn_algo(num) == 0
result = check_if_valid(4532015112830366)
print("Correct:" + str(result))
result = check_if_valid(6011514433546201)
print("Correct:" + str(result))
result = check_if_valid(6771549495586802)
print("Correct:" + str(result))
Producción :
Number =  4532015112830366
Correct:True
Number =  6011514433546201
Correct:True
Number =  6771549495586802
Correct:True
De esta manera, se puede crear fácilmente un programa que valide números utilizando el algoritmo de Luhn en Python.
Use bucles anidados para validar números a través del algoritmo de Luhn
Otra forma de validar números a través del algoritmo de Luhn en Python es mediante el uso de bucles anidados. Este programa usa una sola función para validar un número usando el algoritmo de Luhn en Python.
Entendamos cómo funciona el código.
- 
La primera línea de código crea un método luhn_algocon un parámetronum.
- 
Una variable check_sumse inicializa con cero.def luhn_algo(num): check_sum = 0
- 
Una variable num_parityencuentra la longitud del número dado y comprueba su paridad, si es par o impar.
```python
num_parity = len(num) % 2
```
- 
Se crea un bucle forque se ejecuta hacia atrás desde su posición 0 hasta su longitud. El valor del índicelse copia inicializado en una variablej.for l in range(len(num) - 1, -1, -1): j = int(num[l])
- 
En este punto entra la variable num_parity. Sinum_parityes cero, esto implica quenumes un número par, y viceversa para un número impar.Como todos los dígitos pares debían ser multiplicados por 2, el programa verifica la paridad de su índice l+1. Supongamos que la paridad es0yl + 1 % 2es igual a la paridad, significa que el índiceles un dígito impar.Asimismo, si la paridad es 0y no es igual al + 1 % 2, es un dígito par. Al usar esta lógica, cada dígito par se multiplica por 2, y si el producto es mayor que 9, entonces se divide 9.La variable check_sumse incrementa con el valor dej. Al final de la iteración del bucle,check_sumcalcula la suma final de los dígitos pares e impares.if (l + 1) % 2 != num_parity: j = j * 2 if j > 9: j = j - 9 check_sum = check_sum + j
- 
Como se sabe que la suma final debe ser divisible por 10 para ser validada usando el algoritmo de Luhn en Python, la función devuelve check_sum % 10 == 0.
Código:
def luhn_algo(num):
    check_sum = 0
    num_parity = len(num) % 2
    for l in range(len(num) - 1, -1, -1):
        j = int(num[l])
        if (l + 1) % 2 != num_parity:
            j = j * 2
        if j > 9:
            j = j - 9
        check_sum = check_sum + j
    print("value calculated = ", str(check_sum))
    return check_sum % 10 == 0
for n in (49927398716, 49927398717, 1234567812345678, 1234567812345670):
    print(str(n) + " =>", luhn_algo(str(n)))
Producción :
value calculated =  70
49927398716 => True
value calculated =  71
49927398717 => False
value calculated =  68
1234567812345678 => False
value calculated =  60
1234567812345670 => True
Use la programación funcional para validar números a través del algoritmo de Luhn
Los primeros dos ejemplos usaron un método de procedimiento para validar números usando el algoritmo de Luhn en Python. Este ejemplo usa programación funcional para validar números usando el algoritmo de Luhn en Python.
El uso del método de programación funcional ahorra tiempo y esfuerzo al programador. El siguiente programa de Python valida un número en menos líneas de código.
- 
Se crea un método luhn_algocon un parámetronum.
- 
En una nueva variable rev, los dígitos del parámetronumse almacenan en una lista. Se utiliza un bucleforpara este propósito que itera por el número de dígitos que hay ennum.El operador de corte ::-1invierte los dígitos dentro de la lista.
- 
La sentencia returncalcula toda la operación a la vez.La suma de los dígitos impares se calcula utilizando la sintaxis (sum(rev[0::2]).Los dígitos pares se ejecutan en un buclefor(for d in r[1::2]).Cada dígito se multiplica por 2, y los dígitos del producto se suman mediante la funcióndivmod().La función divmod()toma dos parámetros - numerador y denominador, y devuelve dos valores - cociente y resto.La sintaxis divmod(d * 2, 10)tomad*2como numerador y10como denominador. La resultante se suma para obtener la suma de dígitos.Por último, la función comprueba si la suma final es divisible por 10 y devuelve el resultado. 
- 
Usando un bucle for, se proporcionan cuatro números como entrada y se imprime el resultado.
Código:
def luhn_algo(num):
    rev = [int(ch) for ch in str(num)][::-1]
    return (sum(rev[0::2]) + sum(sum(divmod(d * 2, 10)) for d in rev[1::2])) % 10 == 0
for num2 in (49927398716, 49927398717, 1234567812345678, 1234567812345670):
    print(num2, luhn_algo(num2))
Producción :
49927398716 True
49927398717 False
1234567812345678 False
1234567812345670 True
Conclusión
Este artículo proporciona tres programas para que el lector comprenda cómo validar números utilizando el algoritmo de Luhn en Python.
Se sugiere que el lector lea el artículo, intente escribir el código por sí mismo y regrese en busca de sugerencias. De esta forma, el lector puede crear programas que validen números utilizando el algoritmo de Luhn.