Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于信用卡欺诈的Python算法_Python_Conditional Statements_Credit Card - Fatal编程技术网

用于信用卡欺诈的Python算法

用于信用卡欺诈的Python算法,python,conditional-statements,credit-card,Python,Conditional Statements,Credit Card,提示: 根据一些简单的算法,实现一个确定卡号是否有效的函数。假设信用卡号是一个由14个字符组成的字符串,格式为#####-##-##-###,包括破折号,其中“#”表示一个数字 介于0-9之间,因此总共有12位数字 目标:实现一个名为“验证”的函数,该函数只接受一个参数 调用“编号”,然后检查以下规则: 第一个数字必须是4 第四位数字必须比第五位数字大一位;请记住,这些 由于格式为#####-#-#-# 所有数字之和必须能被4整除 如果将前两位数字视为两位数字,将第七位和第八位数字视为 数字作为

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

目标:实现一个名为“验证”的函数,该函数只接受一个参数 调用“编号”,然后检查以下规则:

  • 第一个数字必须是4
  • 第四位数字必须比第五位数字大一位;请记住,这些 由于格式为#####-#-#-#
  • 所有数字之和必须能被4整除
  • 如果将前两位数字视为两位数字,将第七位和第八位数字视为 数字作为两位数,其总和必须为100
  • 如果不满足条件,则根据失败的规则返回“规则#X”

    我的进展:

    def验证(编号):
    如果len(数字)!=14:
    返回错误
    如果数字[0]!=4:
    打印(“规则1”)
    如果数字[5]+1!=编号[3]:
    打印(“规则2”)
    如果总和(数字)!=int:
    打印(“规则3”)
    如果数字[0,1]+数字[6,7]!=100
    打印(“规则4”)
    返回真值#
    输入=“5000-0000-0000”
    输出=验证(输入)
    打印(输出)
    

    我想我对第三个和第四个条件有困难,但不确定该怎么做/如何处理。

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

    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验证(编号):
    有效=真
    如果len(数字)!=14:
    有效=错误
    如果数字[0]!='4':#数字[0]是一个字符串
    打印(“规则1”)
    有效=错误
    如果编号[5]<编号[3]:
    打印(“规则2”)
    有效=错误
    strippedNum=编号。替换('-','')#删除'-'
    digits_sum=sum([strippedNum中的数字为int(digit))#列出所有数字并找到它们的和
    打印(数字和)
    如果数字总和为%4!=0:
    打印(“规则3”)
    有效=错误
    如果整数(数字[0:1])+整数(数字[6:7])!=100:
    打印(“规则4”)
    有效=错误
    返回有效
    输入=“5000-0000-0000”
    输出=验证(输入)
    打印(输出)
    

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

    对于第三条规则,您可以这样做。删除“-”字符并添加所有数字

    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验证(编号):
    有效=真
    如果len(数字)!=14:
    有效=错误
    如果数字[0]!='4':#数字[0]是一个字符串
    打印(“规则1”)
    有效=错误
    如果编号[5]<编号[3]:
    打印(“规则2”)
    有效=错误
    strippedNum=编号。替换('-','')#删除'-'
    digits_sum=sum([strippedNum中的数字为int(digit))#列出所有数字并找到它们的和
    打印(数字和)
    如果数字总和为%4!=0:
    打印(“规则3”)
    有效=错误
    如果整数(数字[0:1])+整数(数字[6:7])!=100:
    打印(“规则4”)
    有效=错误
    返回有效
    输入=“5000-0000-0000”
    输出=验证(输入)
    打印(输出)
    

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

    您应该
    返回字符串,而不是打印。对于第三条规则,可以使用modulo
    %
    函数。这里有一种方法(第四条规则几乎肯定可以改进…)


    您应该
    返回
    字符串,而不是打印。对于第三条规则,可以使用modulo
    %
    函数。这里有一种方法(第四条规则几乎肯定可以改进…)

    您可以尝试以下方法:

    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]
    访问消息

    您可以尝试以下操作:

    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]
    访问消息

    而不是打印字符串,而是
    返回“rule#1”
    等。FYIcan您能提供更多输入值和相应预期输出的示例吗?您必须处理的第一件事是
    number
    是一个字符串,而不是一个数字,因此您需要将相关部分转换为整数才能对其进行求和。另外,索引到字符串中的正确方法是
    number[0:1]
    ,而不是
    number[0,1]
    ,以获得您可以使用的总和<代码>总和(映射(int,'1234-5678-9012'。替换('-',''))
    这是否回答了您的问题?您不想打印字符串,而是希望
    返回“rule#1”
    等。FYIcan您能提供更多输入值和相应预期输出的示例吗?您必须处理的第一件事是
    number
    是一个字符串,而不是一个数字,因此您需要将相关部分转换为整数才能对其进行求和。另外,索引到字符串中的正确方法是
    number[0:1]
    ,而不是
    number[0,1]
    ,以获得您可以使用的总和<代码>总和(映射(int,'1234-5678-9012'。替换('-',''))这是否回答了您的问题?