用Python,使用 Luhn 算法验证银行卡号

问题遇到的现象和发生背景

使用 Luhn 算法验证银行卡号 (https://en.wikipedia.org/wiki/Luhn_algorithm%EF%BC%89%E3%80%82 实现两个函数来做到这一点。
第一个应该取一个int类型的银行卡号,如果正确则返回true
否则。 不要在函数中使用任何对字符串的转换。 将其命名为 check_card_number。 1
第二个应该采用 str 的卡号类型并返回与整数相同的
类型实现。 不要将整个输入转换为整数,只有一位数转换是
允许。 为您的函数命名 check_card_number_str 。
还提供了一个函数 generate_card_number 可以有效地生成随机银行卡号
作为整数或字符串(取决于您的选择)。 假设您打算生成任一 Visa(它具有
前 «4» 位)或万事达卡(它有前导 «5»)卡号和卡类型作为
函数参数。
笔记。 将您的函数保存在 card_number.py 文件中。

问题相关代码,请勿粘贴截图

Example

assert check_card_number ( 5082337440657928 ) # valid Mastercard card number
assert not check_card_number_str (’ 4601496706376197 ’) # invalid Visa card number

我想要达到的结果

使用以上assert断言测试代码,代码写一下注释。


def luhn_check(num):
  digits = [int(x) for x in reversed(str(num))]
  check_sum = sum(digits[::2]) + sum((dig//10 + dig % 10) for dig in [2*el for el in digits[1::2]])
  return check_sum % 10 == 0

if __name__ == "__main__":
  print(luhn_check(543298376))

def check_card_num(purportedCC=''):
    sum_ = 0
    parity = len(purportedCC) % 2
    for i, digit in enumerate([int(x) for x in purportedCC]):
        if i % 2 == parity:
            digit *= 2
            if digit > 9:
                digit -= 9
        sum_ += digit
    return sum_ % 10 == 0

百度百科就有

有时候在网上办理一些业务时有些需要填写银行卡号码,当胡乱填写时会立即报错,但是并没有发现向后端发送请求,那么这个效果是怎么实现的呢。
对于银行卡号有一个校验算法,叫做Luhn算法。
银行卡号码的校验采用Luhn算法,校验过程大致如下:

  1. 从右到左给卡号字符串编号,最右边第一位是1,最右边第二位是2,最右边第三位是3….

  2. 从右向左遍历,对每一位字符t执行第三个步骤,并将每一位的计算结果相加得到一个数s。

  3. 对每一位的计算规则:如果这一位是奇数位,则返回t本身,如果是偶数位,则先将t乘以2得到一个数n,如果n是一位数(小于10),直接返回n,否则将n的个位数和十位数相加返回。

  4. 如果s能够整除10,则此号码有效,否则号码无效。

因为最终的结果会对10取余来判断是否能够整除10,所以又叫做模10算法。

校验算法比较简单,一个python的实现

#! /usr/bin/python3
# -*- coding: utf-8 -*-
 
 
def luhn(card_num):
    s = 0
    card_num_length = len(card_num)
    for _ in range(1, card_num_length + 1):
        t = int(card_num[card_num_length - _])
        if _ % 2 == 0:
            t *= 2
            s += t if t < 10 else t % 10 + t // 10
        else:
            s += t
    return s % 10 == 0
 
 
if __name__ == '__main__':
    print(luhn('6226095711989751'))
```python


```

如有帮助,请点击我评论上方【采纳该答案】按钮支持一下。

这个难度应该不算大,仿照算法应该很快就可以写出来