【问题标题】:Comparing a variable to an `int` is not working将变量与“int”进行比较不起作用
【发布时间】:2018-12-28 00:52:57
【问题描述】:

我的程序需要来自用户的整数,所以我试图创建一个循环,如果他们输入一个非整数就会发生并且直到他们输入一个整数才会结束。我试过了:

PlayerCount = input("How many players?")
while PlayerCount != int:
    try:
        PlayerCount = int(PlayerCount)
    except ValueError:
        print("Please enter a number between 3 and 5")
        PlayerCount = input("How many players?")

但是,当输入有效输入时,循环不会继续,或者结束并允许程序的其余部分运行。我只是在 IDLE 中看到一个换行符和一个闪烁的光标。我还需要做些什么来正确结束while循环吗?我预计一旦try 块成功,循环会自动结束。

【问题讨论】:

  • 试试not isinstance(PlayerCount, int)而不是PlayerCount != int
  • @ic3b3rg 那将是 un-pythonic 和 hack。
  • 其他变体:改用while True:,并在PlayerCount = int(PlayerCount)之后直接放置break

标签: python python-3.x types


【解决方案1】:

这样做:

PlayerCount = input("How many players?")
while True: #loop forever until `break`
    try:
        PlayerCount = int(PlayerCount)
    except ValueError:
        print("Please enter a number between 3 and 5")
        PlayerCount = input("How many players?")
    else: #no error
        break #exit loop

elsetry 中未出错时运行。

【讨论】:

  • 您介意解释一下为什么这比上面的“not isinstance(PlayerCount, int)”示例更好吗?我注意到您称其为“黑客”,但在我看来,他们似乎在做同样的事情。
  • 没关系,我在更远的地方阅读了 cmets,其中解释说这对 try 循环来说是多余的。感谢您的帮助!
  • @MattJohnson 是的,如果你想使用isinstance,你可以,但你应该用numbers.Integral 替换int。不过,您必须首先在代码顶部 import numbers 执行此操作。
【解决方案2】:

错误在while PlayerCount != int:这一行。

PlayerCount != int 永远为真。您可能想要做的是检查PlayerCount 是否为整数类型。但您实际上是在检查它是否等同于 int 本身。请注意,实际整数与 int 类不同。

要检查PlayerCount 是否是int 类的实例,请将条件替换为while not isinstance(PlayerCount, int):

【讨论】:

  • 不要检查int,检查abc。目前这是unpythonic。使用numbers.Integral (import numbers)
  • 我喜欢检查 int 的文件在这里就足够了。我们知道PlayerCount 永远只会是strint,所以这里没有必要使用abc。和Simple is better than complex 如 Python 之禅所述。
【解决方案3】:

尝试在第一行的while循环中使用isinstance,那么就不需要修改while循环的内部了:

PlayerCount = input("How many players?")
while not isinstance(PlayerCount, int):
    try:
        PlayerCount = int(PlayerCount)
    except ValueError:
        print("Please enter a number between 3 and 5")
        PlayerCount = input("How many players?")

【讨论】:

    【解决方案4】:

    在您的代码中,您将用户输入与int进行比较。您没有检查它是否是int 的实例。无论如何,您已经在检查您的 try-except 块。当输入不是有效整数时,将执行 except 块。

    只要改成这样:

    PlayerCount = input("How many players?")
    while True:
        try:
            PlayerCount = int(PlayerCount)
            break
        except ValueError:
            print("Please enter a number between 3 and 5")
            PlayerCount = input("How many players?")
    

    如 cmets 中所述,另一种方法是使用 isinstance(PlayerCount, int),它根据 PlayerCount 是否是 int 的实例返回 bool 值。

    【讨论】:

    • 只将“危险”代码放入if。使用else(如我的回答)作为break
    • @EthanK 如果int 因错误而失败,break 无论如何都不会被执行。两种方式都能很好地完成任务,我只是更喜欢这种方式。
    • @Davidthethrid 他们都工作,但我的说“做可能导致错误的事情,如果不是错误则中断”,而你的说“做可能导致错误的事情”错误(中断也可能导致错误)break 不会导致错误,所以这是错误的。休息应该在else,因为休息不是你需要try的原因。
    • @EthanK mine 说的更像是“执行代码直到发生错误,如果int 没有导致错误则中断”。此外,如果您没有在 try 块中放入不会导致错误的 任何内容,代码会变得非常混乱。
    • @Davidthethrid ...除了没有办法知道 那一行 是可能有错误的那一行,但在我看来,哪一行是问题。在这种情况下,这可能无关紧要(因为break 不会导致错误),但在其他代码中,这会成为问题,永远都不应该这样做。
    【解决方案5】:

    问雅各布指出,与int 相比是不正确的。我建议有一个循环重试,直到输入 3 到 5 之间的整数:

    while True:
        player_count = input('How many players (3-5)? ')
        try:
            player_count = int(player_count)
            if player_count in (3, 4, 5):
                break
        except ValueError:
            pass
    

    几点:

    • 此方法仅包括 1 个input 函数调用
    • 用户输入也转换为int
    • 它检查两个条件:int 和范围 3..5

    【讨论】:

      【解决方案6】:
      PlayerCount = input("How many players?")
      while type(PlayerCount) != int:
          try:
              PlayerCount = int(PlayerCount)
          except ValueError:
              print("Please enter a number between 3 and 5")
              PlayerCount = input("How many players?")
          else:
              pass
      

      else 部分在没有异常时执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        • 2014-06-15
        • 1970-01-01
        • 1970-01-01
        • 2018-10-13
        相关资源
        最近更新 更多