为什么我收到此错误" IndexError:字符串索引超出范围"

时间:2016-01-24 11:09:15

标签: python

我们被要求编写一个验证GTIN-8代码的程序。 价值如下:

  1. 将前7位数交替乘以3然后1

  2. 添加

  3. 从10

  4. 的相等或更高倍数中减去该数字
  5. 结果数字是第八位

  6. 这是我的代码:

    def validgtin():  
    
        gtin = input("Enter the 8 digits of GTIN-8 product code: ")   
        valid = False
        while valid == False:
            if gtin.isdigit():               
                gtin = str(gtin)
                if len(gtin) == 8:          
                    valid = True
                else:
                    print("That is not correct, enter 8 digits, try again: ")       
                    gtin = input("Enter the 8 digits of GTIN-8 product code: ")
            else:
                print("That is not correct, type in numbers, try again: ")
                gtin = input("Enter the 8 digits of GTIN-8 product code: ")     
    
    
        sumdigit =  3*(int(gtin[0])) + 1*(int(gtin[1])) + 3*(int(gtin[2])) + 1*(int(gtin[3])) + 3*(int(gtin[4])) + 1*(int(gtin[5])) + 3*(int(gtin[6]))  #sum of the digits
    
        gtin = str(gtin)  
    
        valid1 = False
        while not valid1:
            if sumdigit%10 == 0:    
                eightdigit = 0
            else:
                eightdigit = (((sumdigit + 10)//10)*10) - sumdigit  
    
            if eightdigit == (gtin[7]):
                valid1 = True
                print("Your GTIN-8 product code is valid.")
    
            else:
                print("Your GTIN-8 product code is not valid.")
                gtin = input("Enter the 8 digits of GTIN-8 product code: ")
    
    
        return
    
    validgtin()
    

    当我运行此代码并输入无效的GTIN-8代码时,它表示代码无效并提示我输入新的GTIN-8代码

    BUT

    输入新的有效GTIN-8代码后,它仍然表示无效

    AND

    之后会发生这种情况:

    Traceback (most recent call last):
    
    
    
    File "C:\Users\Yash Dwivedi\Documents\Year 10\GCSE Computing\Assignment\Task 1 v2.py", line 29, in validgtin
        if eightdigit == (gtin[7]):
    IndexError: string index out of range
    

    我不明白为什么 我会感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

我建议制作一个“is_valid_gtin”函数,只检查GTIN是否有效,没有I / O.然后用一个简单的“main()”来检查代码:

def is_valid_gtin(gtin):
    if len(gtin) != 8 or not gtin.isdigit():
        return False
    sum = 0
    for i in list(gtin)[0:6:2]:
        sum += 3*int(i)
    for i in list(gtin)[1:6:2]:
        sum += int(i)
    checksum = (10 - sum % 10) % 10
    return checksum == int(gtin[7])


def main():
    while (True):
        gtin = input("Enter the 8 digits of GTIN-8 product code: ")
        if is_valid_gtin(gtin):
            print("Your GTIN-8 product code is valid.")
            break
        else:
            print("That is not correct, try again.")

if __name__ == '__main__':
    main()

答案 1 :(得分:0)

这是我的快速实施。可悲的是,我没有任何测试数据来检查它是否正确!

def _round_up_ten(number):
    if number % 10 == 0:
        return number
    return 10 * (1 + (number / 10))


def validate_gtin(gtin):
    if not gtin.isdigit() or len(gtin) != 8:
        raise ValueError("GTIN must be an 8-digit number")

    digits = [int(digit) for digit in gtin[:-1]]
    check_digit = int(gtin[-1])

    multiplied_digits = (
        digits[0] * 3
        + digits[1]
        + digits[2] * 3
        + digits[3]
        + digits[4] * 3
        + digits[5]
        + digits[6] * 3
    )

    expected_check_digit = _round_up_ten(multiplied_digits) - multiplied_digits

    if check_digit!= expected_check_digit:
        raise ValueError("Incorrect check digit ({}) (expected {})".format(check_digit, expected_check_digit))

答案 2 :(得分:0)

错误在行

if eightdigit == (gtin[7]):

eightdigit是一个int,但gtin[7]是一个字符串。因此,此比较始终为false - 因此您处于无限循环中(只要您输入至少包含8个字符的字符串)。你变得沮丧,然后只需按下回车键 - 它会将你的代码传递给空字符串,缺少第八个字符会触发索引超出范围错误。

因此你需要:

if eightdigit == int(gtin[7]):

修复那个特定的bug,虽然这仍然会给你留下一个逻辑错误 - 因为代码底部的循环不会验证输入,而你正试图检查新的候选gtins对照一个用于计算的checkdigit 之前的输入。您应该遵循@JacquesSupik的优点并重构代码,以便验证逻辑与I / O逻辑分离。