Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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 需要代码方面的帮助,所有结果都返回False,而2应该为true_Python - Fatal编程技术网

Python 需要代码方面的帮助,所有结果都返回False,而2应该为true

Python 需要代码方面的帮助,所有结果都返回False,而2应该为true,python,Python,所以基本上,我需要为luhn算法编写一个代码,但我需要至少有5个函数 我已经编写了一个代码来实现这一点,但是我收到了错误的结果,而这些结果应该是正确的。例如,我知道数据文件中的第二个和第四个数据段对于该算法是真的,但我所有的输出都是假的。你能帮我找出哪里出了问题吗 代码如下: def CheckLength(numb): if len(numb)>12 and len(numb)<17: return True else: return

所以基本上,我需要为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()    
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')
这是我在打印所有3个步骤时得到的输出

4
63
False
0
63
False
7
15
False
4
63
False
(我的评论作为回答,包括@DavidZemens评论中的建议和更正)

关于bug,我认为您有:

步骤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
可以是:

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()。在代码中,可以使用
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):
返回12
(我的评论作为回答,包括@DavidZemens评论中的建议和更正)

关于bug,我认为您有:

步骤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
可以是:

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()。在代码中,可以使用
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):
返回12
您的问题是否在
eval
功能中?您正在传递字符串,对字符串应用eval,如
eval('3')*2
将产生
33
,而不是
6
。改为尝试
int(num[1])*2
。在
for
循环中有
def Step1()
返回total
语句,因此循环永远不会结束。这是在你的代码中,还是你的问题中的一个输入错误?卢恩算法第二步是“取所有数字的和”,但你的第二步函数不这样做,它对范围内的i(长度-1,-2,-2)进行
:total+=i
-我想它应该是范围内的i(长度-1,-1,-1):total+=numb[i]
一次减去一而不是减去二,取数字而不是计数器。您需要执行
total+=int(numb[i])
将字符串转换为int。这是单元测试的一个很好的用例。您可以编写代码,使用已知答案的数据调用每个函数。让部件正常工作,然后再为整体担心。您的问题可能是在
eval
功能中吗?您正在传递字符串,对字符串应用eval,如
eval('3')*2
将产生
33
,而不是
6
。改为尝试
int(num[1])*2
。在
for
循环中有
def Step1()
返回total
语句,因此循环永远不会结束。这是在你的代码中,还是你的问题中的一个输入错误?卢恩算法第二步是“取所有数字的和”,但你的第二步函数不这样做,它对范围内的i(长度-1,-2,-2)进行
:total+=i
-我想它应该是范围内的i(长度-1,-1,-1):total+=numb[i]
一次减去一而不是减去二,取数字而不是计数器。您需要执行
total+=int(numb[i])
将字符串转换为int。这是单元测试的一个很好的用例。您可以编写代码,用您已经知道的answe数据调用每个函数