【问题标题】:Why do I keep getting TypeError even though input is an interger?为什么即使输入是整数,我也会不断收到 TypeError?
【发布时间】:2020-11-19 21:13:58
【问题描述】:

我正在为一个学校项目编写一些代码,该项目要求用户输入 0-10 之间的数字,但我不知道为什么即使使用列表将输入转换为整数,我仍然会收到 TypeError。请问有什么帮助吗?我在 Wing IDE 101 上执行此操作。

numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
while True:
    num = ''
    while num == '':
        try:
            num = input("Please enter a number: ")
            num = int(num)
        except ValueError:
            if num in numbers:
                num = numbers.index(num)
                num = int(num)
            else:
                print('Invalid input, please enter valid input')
    if num == 0:
        print("Thank you for using this program")
        break
    elif num < 0 or num > 10:
        print("This is an invalid number, please enter a valid number.")
        print()
        continue

【问题讨论】:

  • 您只是在做bool(TypeError),即True,而不管num 或您期望的任何条件。 if TypeError的目的是什么?
  • 如果您想检查TypeError,请在except 中使用,例如。 except ValueError, TypeError: do_something
  • if TypeError 只是用来检查是否有一个。虽然它可以被删除。此外,如果删除了 if TypeError 和 elif num 10,则代码有效。
  • if TypeError 不检查TypeError 是否发生,它检查对象TypeError 是否评估为True,它总是会的,你的条件基本上意味着TypeError是python中的东西。
  • @SayanipDutta 如果你删除我刚刚添加的 if TypeError 似乎没有理由你得到elif num &lt; 0 or num &gt; 10: builtins.TypeError: '&lt;' not supported between instances of 'str' and 'int' ,我不知道为什么。

标签: python typeerror


【解决方案1】:

在动态语言中会发生很多事情,因为类型是在运行时而不是在设计时解析的,所以有时很难确定。

首先,将 user_input 与您正在评估的数字 (num) 分开,分成 2 个不同的参数(一个用于用户输入字符串,一个用于整数) - 我知道这在 Python 上并不重要,但它是一个很好的做法。

现在您的num 值只会在成功解析时分配。循环结束时也不需要continue

代码片段

numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
while True:
    user_input = ''
    num = None  # default invalid value
    while num is None:
        try:
            user_input = input("Please enter a number: ")
            num = int(user_input)
        except ValueError:
            if user_input in numbers:
                num = numbers.index(user_input)
            else:
                print('Invalid input, please enter valid input')
                print()
    if num == 0:
        print("Thank you for using this program")
        break
    elif num < 0 or num > 10:
        print("This is an invalid number, please enter a valid number.")
        print()

调试输出

Please enter a number: 1
Please enter a number: one
Please enter a number: 11
This is an invalid number, please enter a valid number.

Please enter a number: -1
This is an invalid number, please enter a valid number.

Please enter a number: no numbder
Invalid input, please enter valid input

Please enter a number: 0
Thank you for using this program

Process finished with exit code 0

【讨论】:

    【解决方案2】:

    我认为是这个原因:

    当您的输入不是"asdf" 等有效输入时。它会跳出内部的while循环。因为你内部的while循环条件是num == '',而num现在是"asdf"

    您只需将num = "" 放在print('Invalid input, please enter valid input') 下,您的代码就可以正常工作,不再引发 TypeError。

    完整代码如下:

    numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
    while True:
        num = ''
        while num == '':
            try:
                num = input("Please enter a number: ")
                num = int(num)
            except ValueError:
                if num in numbers:
                    num = numbers.index(num)
                    num = int(num)
                else:
                    print('Invalid input, please enter valid input')
                    num = ""
        if num == 0:
            print("Thank you for using this program")
            break
        elif num < 0 or num > 10:
            print("This is an invalid number, please enter a valid number.")
            print()
            continue
    

    实际上你的代码可以简化为一个循环:

    numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
    while True:
        num = input("Please enter a number: ")
        if num in numbers:
            num = numbers.index(num)
        else:
            try:
                num = int(num)
            except ValueError:
                print("Invalid input, please enter valid input")
                continue
        if num == 0:
            print("Thank you for using this program")
            break
        elif num < 0 or num > 10:
            print("This is an invalid number, please enter a valid number.")
    

    【讨论】:

    • numbers.index(num) 已经是整数,所以下一行不需要int(num)
    • 我只是复制问题中的所有代码并插入 num = "" 以使 Flameboy0501 更容易理解这一点。但我认为你是对的。会改变答案。
    • 抱歉,我以为我在引用 OP。
    • 感谢@XuQiushi,Chris 已经指出我应该在 else 末尾添加 num = '' 但这个简化的循环也很有帮助。
    猜你喜欢
    • 2021-08-21
    • 1970-01-01
    • 2021-01-23
    • 2018-04-10
    • 1970-01-01
    • 2013-09-08
    • 2021-12-30
    • 2022-01-20
    • 2019-10-11
    相关资源
    最近更新 更多