所以基本上,我需要为luhn算法编写代码,但我需要至少有5个函数
我已经编写了一个代码来执行此操作,但我收到了错误的结果,它们应该是真的。例如,我知道数据文件中的第二个和第四个数据对于此算法是正确的,但我的所有输出都是假的。你能帮我弄清楚我哪里出错吗?
这是代码:
def CheckLength(numb):
if len(numb)>12 and len(numb)<17:
return True
else:
return False
def CheckType(numb):
if numb[0]=='4':
return 'Visa'
elif numb[0]=='5':
return 'MasterCard'
elif numb[0]=='6':
return 'Discover'
elif numb[0:2]=='37':
return 'American Express'
else:
return 'Invalid Entry'
def Step1(numb):
total1=0
total2=0
length=len(numb)
for i in range(length-2,-1,-2):
double=eval(numb[i])*2
if double>9:
doublex=str(double)
doubleY=int(doublex[0])+int(doublex[1])
total1+=doubleY
else:
total2+=double
total=total1+total2
return total
def Step2(numb):
total=0
length=len(numb)
for i in range(length-1,-2,-2):
total+=i
return total
def Step3(num1,num2):
total=num1+num2
if total%10==0:
return True
else:
return False
def main():
inFile=open('pa7.cards','r')
cardNum=inFile.readline().strip()
while cardNum!='99999':
step1=Step1(cardNum)
step2=Step2(cardNum)
step3=Step3(step1,step2)
print(step1)
print(step2)
print(step3)
cardNum=inFile.readline().strip()
inFile.close()
main()
这是数据文件:
4388576018402626
4388576018410707
37271983
5190828258102121
99999
这是打印所有3个步骤时得到的输出
4
63
False
0
63
False
7
15
False
4
63
False
答案 0 :(得分:4)
(我的评论作为答案,包括来自@ DavidZemens的建议和更正&#39;评论)
就错误而言,我认为你有:
第1步在循环中有return
语句,因此循环只发生一次,然后停止。
def Step1(numb):
for i in range(length-2,-1,-2):
return total
^ -- ^ -- move this left, to where 'for' is
第2步将计数器加起来,而不是信用卡数字,并且它会逐步通过每个其他数字而不是每个数字:
def Step2(numb):
total=0
length=len(numb)
for i in range(length-1,-1,-1):
total += int(numb[i])
return total
在一般代码注释中,这种测试:
if len(numb)>12 and len(numb)<17:
return True
else:
return False
有点多余。 如果(真值测试)返回True,则返回False 可以成为返回(真值测试):
return 12 < len(numb) < 17
以后:
total = num1 + num2
if total%10==0:
return True
else:
return False
可以是:
return (num1 + num2) % 10 == 0
此计算:
double=eval(numb[i])*2
if double>9:
doublex=str(double)
doubleY=int(doublex[0])+int(doublex[1])
total1 += doubleY
有点尴尬,将数字转换成文本,取文字字符,将它们转回数字,然后将它们相加。
它的作用是取十个数(整数除以10)和余数(模10),所以你可以将它全部保存为数字:
double = int(numb[i]) * 2
if double > 9:
total1 += (double // 10) + (double % 10)
eval()
是一种不好的做法,它为任何输入提供了对Python解释器的完全访问权限,没有任何安全措施。在您的代码中,您可以使用int()
代替
您的文件循环可能更清晰:
def main():
with open('pa7.cards') as inFile:
for cardNum in inFile:
cardNum = cardNum.strip()
step1=Step1(cardNum)
step2=Step2(cardNum)
step3=Step3(step1,step2)
print(step1)
print(step2)
print(step3)
您可以通过将cardNum转换为一个数字列表然后再使用它来获得一些好处,而不是在整个地方调用int()
。
您还可以优化两个未使用的函数(假设您在代码中的其他位置使用它们):
def CheckLength(numb):
return 12 < len(numb) < 17
def CheckType(numb):
"""
returns the type of credit card, based on the first digit or 2 digits
numb; passed as string
"""
n = numb[0] if not numb[0] == '3' else numb[:1]
d = {4:'Visa',
5:'Mastercard',
6:'Discover',
37:'American Express'}
return d.get(int(n), 'Invalid Entry')