【问题标题】:How to check for an integer in Python 3.2?如何在 Python 3.2 中检查整数?
【发布时间】:2012-10-16 21:19:06
【问题描述】:

我正在尝试编写一个程序,其中用户输入一个两位整数,输出是第二个数字,打印出第一个数字指示的次数。这是我目前所拥有的:

number = input('Type two-digit integer \n')
a = int(number)//10
b = int(number)%10
if len(number) != 2:
    print(number, 'is not a two-digit integer')
else:
    print(a*str(b))

当我对此进行测试时,只要有人输入数字,它就会按照我的意图去做。如果有人要输入,比如 6r,就会弹出一条错误消息:

a = int(number)//10

ValueError: int() 以 10 为底的无效文字:'6r'

所以我假设需要在代码的第二行添加一些东西来测试输入是否实际上是一个整数,我该怎么做?用不同的方式重写它会更好吗?请记住,我正在参加 Python 入门课程,这是我正在参加的练习中期的一个问题,所以如果我不得不在真正的中期回答这样的问题,我不能使用很多复杂的过程。

这是我尝试过的,如果有人键入不是整数的东西,但由于某种原因,我不知道它为非整数提供了与整数相同的消息,并且没有按我的意图运行它到:

number = input('Type two-digit integer \n')
if (isinstance(number, int)) == False:
    print(number, 'is not a two-digit integer')
elif len(number) != 2:
    print(number, 'is not a two-digit integer')
else:
    a = int(number)//10
    b = int(number)%10
    print(a*str(b))

我们将不胜感激!

【问题讨论】:

    标签: python integer


    【解决方案1】:

    这里最好的选择是捕获异常。出了点问题,而这正是异常旨在处理的内容:

    try:
        ...
    except ValueError:
        print("You need to enter an integer!")
        ...
    

    Python 有一句格言请求宽恕比请求许可好,所以不要事先检查它是否有效,尝试一下,如果无效则处理问题。

    这使得代码更可靠(检查可能会意外地禁止良好的输入,或者让错误的输入通过),并使代码更好地阅读(您首先处理正常情况,然后处理问题,而不是检查问题,然后处理)。

    【讨论】:

    • 我个人的偏好是在您通常不会期望无效输入时使用try-except,而当您期望大部分的无效输入时使用if-elif-else时间。由于您希望用户输入一个 int,因此 try-except 将是最好的构造。这是绝对最好的答案!
    • @ThaneBrimhall 从性能和代码清晰度的角度来看,这是一个很好的方法,尽管我不认为在某些情况下应该每次都捕获异常,例如您处理文件系统的任何地方(因为可能存在竞争条件)。
    • 这很好。我的规则肯定有例外try: my_rule(); except: do_something_else().
    • 啊,异常幽默,我总是和朋友们提出这个话题,但他们似乎从来没有赶上
    • @Lattyware 尝试,你最终放弃了吗?
    【解决方案2】:

    这是tryexcept 的最佳时机:

    try:
       val = int(number)
    except ValueError:
       print("That's not a number...")
    

    【讨论】:

      【解决方案3】:

      也许最简单的方法是使用number.isdigit()。如果字符串中的所有字符都是数字,isdigit 将返回 true,这意味着它是一个正整数。所以你可以这样做:

      if not number.isdigit():
          print "You didn't enter an integer!"
      

      请注意,使用 try/except 其他答案建议将允许负整数,这可能对您的用例没有意义(您不能打印字符串 -2 次)。

      问题是您并不真正想要“两位整数”,您想要一个由两位数字组成的字符串,您将把它用作两个单独的数字。

      【讨论】:

      • 但这对负整数没有好处......(这可能超出了这个问题的范围,但仍然很高兴知道)。
      • @mgilson:是的,但这是一个优势,因为他的实际用例也不适用于负整数。
      • 您认为捕获异常是不好的,因为它可能会通过错误的输入,但我认为最好在 (if x < 0: ...) 之后明确检查这种情况。
      【解决方案4】:

      我会选择类似的东西:

      number = re.match(r'(\d)(\d)', input('Typo two digit number:\n'))
      if number is not None:
          print(int(number.group(1)) * number.group(2))
      else:
          pass # something wasn't right...
      

      【讨论】:

      • 真的吗?一个正则表达式?大量的矫枉过正。这要复杂得多,也不太清楚。
      • @Lattyware 对大多数事情来说,正则表达式并不是我的第一个想法,但是:3 行 - 自动字符和长度验证,自动变量拆分,根本不是 unclear (恕我直言无论如何)
      猜你喜欢
      • 1970-01-01
      • 2018-05-19
      • 2016-04-14
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 2012-10-07
      • 2013-10-26
      • 2013-12-26
      相关资源
      最近更新 更多