信用卡欺诈的 Python 算法
Posted
技术标签:
【中文标题】信用卡欺诈的 Python 算法【英文标题】:Python algorithm for Credit Card fraud 【发布时间】:2020-10-11 02:53:43 【问题描述】:提示: 根据一些简单的算法,实现一个判断卡号是否有效的函数。假设信用卡号是一个由14个字符组成的字符串,格式为####-####-####,包括破折号,其中‘#’代表一个数字 0-9 之间,所以总共有 12 位数字。
目标:实现一个名为“verify”的函数,它接受一个参数 称为“数字”,然后检查以下规则:
-
第一个数字必须是 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)
我认为我在第三种和第四种情况下遇到困难,但不知道该怎么做/如何处理它。
【问题讨论】:
您不想打印字符串,而是想return "rule#1"
等。仅供参考
您能否提供更多输入值和相应预期输出的示例?
您首先要处理的是number
是一个字符串,而不是一个数字,因此您需要将相关部分转换为整数才能对它们进行求和。索引到字符串的正确方法是number[0:1]
,而不是number[0,1]
要获得总和,您可以使用它; sum(map(int, '1234-5678-9012'.replace('-', '')))
这能回答你的问题吗? Python Credit Card Validation
【参考方案1】:
您应该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】:你可以试试这个:
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]
获取消息
【讨论】:
【参考方案3】:对于第三条规则,您可以这样做。删除“-”字符并添加所有数字。
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)
此方法一次打印所有故障并给出布尔输出。
【讨论】:
以上是关于信用卡欺诈的 Python 算法的主要内容,如果未能解决你的问题,请参考以下文章