什么使字符串索引超出范围错误意味着什么?

时间:2017-05-19 17:10:15

标签: python string python-3.x indexing

我在python 3中制作一个计算器,并且我创建了一个函数来检查输入中的字母。当它运行字母检查时,它会给我一个字符串索引超出范围的错误。这是代码:

while True:
num = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
op = input("What operation would you like to use(+,-,*,/,**): ")
num1 = input("What is the first number you want to use: ")
length1 = len(num1)
lc1 = 0
def letterCheck1():
    global num1
    global length1
    global lc1
    while lc1 <= length1:
        if num1[lc1] in num:
            num1 = input("No letters, just numbers: ")
        else:
            lc1 = lc1 + 1
while True:
    letterCheck1()
    if len(num1) == 0:
        num1 = input("Actually enter something: ")
        continue
    else:
        break   
num2 = input ("What is the second number you want to use: ")
length2 = len(num2)
lc2 = 0
def letterCheck2():
    global num2
    global length2
    global lc2
    while lc2 <= length2:
        if num2[lc2] in num:
            num2 = input("No letters, just numbers: ")
        else:
            lc2 = lc2 + 1
while True:
    while True:
        if op == "/" and num2 == "0":
           num2 = input("It is impossible to divide a number by 0. Try again: ")
           continue
        else:
           break
    letterCheck2()    
    if len(num2) == 0:
        num2 = input("Enter more than 0 numbers please: ")
        continue
    else:
        break
if op == "+":
    print (float(num1) + float(num2))
elif op == "-":
    print (float(num1) - float(num2))
elif op == "*":
    print (float(num1) * float(num2))
elif op == "/":
    print (float(num1) / float(num2))
elif op == "**":
    print (float(num1) ** float(num2))
again = input("Would you like to do another problem? 1(Yes), 2(No): ")
while True:
    if again != "1" or again != "2":
        again = input("Please enter 1(Yes), or 2(No): ")
        continue
    else:
        break
if again == "1":
    continue
elif again == "2":
    leave = input("You are about to exit, do you want to continue? 1(Yes), 2(No): ")
while True:
    if leave != ("1" or "2"):
        leave = input("Please enter 1(Yes), or 2(No): ")
        continue
    else:
        break
if leave == '1':
    continue
elif leave == '2':
    break

2 个答案:

答案 0 :(得分:0)

从0索引到len(num1) - 1.修复此

while lc1 < length1

和这个

while lc2 < length2

答案 1 :(得分:0)

这是一种更清洁的方法:

def get_float(prompt):
    while True:
        try:
            return float(input(prompt))
        except ValueError:
            # not a float, try again
            pass

# division is the only operation that requires more than a one-liner
def op_div(a, b):
    if b == 0:
        print("Dividing by 0 makes the universe explode. Don't do that!")
        return None
    else:
        return a / b

# dispatch table - look up a string to get the corresponding function
ops = {
    '*':  lambda a,b: a * b,
    '/':  op_div,
    '+':  lambda a,b: a + b,
    '-':  lambda a,b: a - b,
    '**': lambda a,b: a ** b
}

def main():
    while True:
        op = input("What operation would you like to use? [+, -, *, /, **, q to quit] ").strip().lower()
        if op == "q":
            print("Goodbye!")
            break
        elif op not in ops:
            print("I don't know that operation")
        else:
            a = get_float("Enter the first number: ")
            b = get_float("Enter the second number: ")
            res = ops[op](a, b)
            print("{} {} {} = {}".format(a, op, b, res))

if __name__=="__main__":
    main()