信用卡欺诈的Python算法

时间:2020-06-21 03:50:41

标签: python conditional-statements credit-card

提示: 根据一些简单的算法,实现一个确定卡号是否有效的功能。假设信用卡号码是一个由14个字符组成的字符串,格式为####-####-####,包括破折号,其中“#”代表一个数字 在0到9之间,因此总共有12位数字。

目标:实现一个称为“ verify”的函数,该函数采用单个参数 称为“数字”,然后检查以下规则:

  1. 第一位数字必须为4。
  2. 第四位必须比第五位大一位;请记住,这些 由于格式为####-####-####,所以用短划线分隔。
  3. 所有数字的总和必须被4整除。
  4. 如果您将前两位数字视为两位数字,将第七位和第八位视为 数字作为两位数,它们的总和必须为100。

如果不满足条件,则根据失败的规则返回“ rule#X”。

我的进度:

def verify(number):
    if len(number) != 14:
        return False
    if number[0] != 4:
        print("rule#1")
    if number[5] + 1 != number[3]:
        print("rule#2")
    if sum(number) != int:
        print("rule#3")
    if number[0,1] + number[6,7] != 100
        print("rule#4")

    return True # 

input = "5000-0000-0000" 
output = verify(input) 
print(output) 

我认为我在遇到第三个和第四个条件时遇到困难,但不确定该怎么做/如何处理它。

3 个答案:

答案 0 :(得分:0)

对于第三个规则,您可以这样操作。删除'-'字符并添加所有数字。

strippedNum=number.replace('-','')  # remove '-'
digits_sum = sum([int(digit) for digit in strippedNum]) # make a list with all the digits and find their sum
if sum_of_all % 4 != 0:
    print(rule#3)

在第四种情况下,您可能会遇到错误,因为您试图将两个字符串连接起来并等于一个整数。

  if int(number[0:1]) + int(number[6:7]) != 100 # Use [lower_limit:upper_limit] when extracting from a list
    print("rule#4")

因此,这就是最终代码的外观(处理字符串和整数时要小心)

def verify(number):
    valid = True
    if len(number) != 14:
        valid = False
if number[0] != '4':    # number[0] is a string
    print("rule#1")
    valid = False


if number[5] < number[3]:
    print("rule#2")
    valid = False


strippedNum=number.replace('-','')  # remove '-'
digits_sum = sum([int(digit) for digit in strippedNum]) # make a list with all the digits and find their sum
print(digits_sum)
if digits_sum % 4 != 0:
    print("rule#3")
    valid = False


if int(number[0:1]) + int(number[6:7]) != 100:
    print("rule#4")
    valid = False


return valid 

input = "5000-0000-0000" 
output = verify(input) 
print(output)

此方法可一次打印所有故障并提供布尔输出。

答案 1 :(得分:0)

您应该return字符串而不是打印字符串。对于第三条规则,可以使用模%函数。这是一种方法(第四条规则几乎可以肯定得到改善...)

def verify(number):
    if len(number) != 14 or int(number[0]) != 4:
        return False
    if int(number[0]) != 4:
        return "rule#1"
    if int(number[5]) + 1 != int(number[3]):
        return "rule#2"
    if sum(int(num) for num in number.replace("-","")) % 4 != 0:
        return "rule#3"
    if int(str(number[0] + str(number[1]))) + int(str(number[6] + str(number[7]))) != 100:
        return "rule#4"
    return True

input = "4501-0550-0000"
output = verify(input)
print(output)

答案 2 :(得分:0)

您可以尝试以下操作:

import re
def verify(number):
    try:
        ## remove any spaces in begginng and end
        number = number.strip()
        ## remove any spaces between numbers
        number = re.sub("\s+","",number)
        if len(number) != 14:
            return False, "current number length is "+str(len(number)) + " but number is missing the expected length of 14."
        if int(number[0]) != 4:
            return False, "First digit must be 4. but received first digit is " + number[0]
        if int(number[5]) + 1 != int(number[3]):
             return False, "The fourth digit must be one greater than the fifth digit"
        if sum([int(digit) for digit in re.sub("-","",input)]) % 4 != 0:
            return False, "Sum of all digit is not divisible by 4"
        if int(input[0:2]) +  int(input[-2:]) != 100:
            return False, "Sum of first two digit and last two digit is not 100"
        return True, "All conditions are met"
    except Exception as e:
        print(e)
        return False, "code got interrupted."
    
input = "4000-0000-0010" 
output = verify(input) 
print(output) 

您可以通过output[0]获取真/假和output[1]获取消息的输出