【问题标题】:How to check if input is a natural number in Python?如何检查输入是否是Python中的自然数?
【发布时间】:2015-01-01 01:30:19
【问题描述】:

现在我正在尝试制作一个简单的井字游戏,当用户为下一步选择棋盘扇区时,我需要检查输入是否为个位数的自然数。我不认为仅仅创建一个['1','2','3'...'9'] 列表并为此调用一个 in 语句是最理想的事情。你有什么建议吗?

【问题讨论】:

  • 现在我至少知道所有可能的方法了。谢谢大家的回答!

标签: python string python-3.x input numbers


【解决方案1】:

您可以检查字符串 x 是否为单个数字自然数,方法是检查字符串是否包含数字并且这些数字的等效整数在 1 到 9 之间,即

x.isdigit() and 1 <= int(x) <= 9

另外,如果 x.isdigit() 返回 false,则由于使用 and 的表达式,永远不会评估 int(x)(因为结果已知,所以没有必要)因此如果字符串不是一个数字。

【讨论】:

  • 也可以,但仅检查 len == 1 的工作方式相同。
【解决方案2】:

使用lenstr.isdigit

>>> x = '1'
>>> len(x) == 1 and x.isdigit() and x > '0'
True
>>> x = 'a'
>>> len(x) == 1 and x.isdigit() and x > '0'
False
>>> x = '12'
>>> len(x) == 1 and x.isdigit() and x > '0'
False

替代方案:使用len 和链式比较:

>>> x = '1'
>>> len(x) == 1 and '1' <= x <= '9'
True
>>> x = 'a'
>>> len(x) == 1 and '1' <= x <= '9'
False
>>> x = '12'
>>> len(x) == 1 and '1' <= x <= '9'
False

【讨论】:

  • 哦,我完全忘记了 len。谢谢!
【解决方案3】:

为什么不直接使用

>>> natural = tuple('123456789')
>>> '1' in natural
True
>>> 'a' in natural
False
>>> '12' in natural
False

检查您初始化一次的小元组中的成员身份非常高效,tuple 尤其优于 set,因为它针对少量项目进行了优化。使用lenisdigit 太过分了。

【讨论】:

  • 好吧,我只是想知道一种更紧凑的检查方式,无需打印整个自然数行。
  • @Owlythesova 但这是最​​好的方法,而且速度非常快。检查tuple 也比list 快(python 可以优化此成员资格检查,因为元组是不可变的)。两个函数调用必须更慢,但我没有做任何计时
  • @Owlythesova,如果不想手动列出,可以使用string.digits[1:]
  • @PM2Ring 你走得太远了,这段代码不是瓶颈。
  • 这是有道理的,但认为这真的会有所作为是可笑的
【解决方案4】:

在控制台上进行操作可能会有所帮助:

>>> x=1
>>> x>0 and isinstance(x,int)
True

【讨论】:

    【解决方案5】:

    我不知道人们为什么要把它推到一个新的水平。 简单来说自然数就可以写了,

    int(x) > 0
    

    对于范围问题:

    0 < int(x) <= 9
    

    显然范围内的数字是自然数。

    【讨论】:

    • 如果 x 等于 12.45 之类的东西,你的代码对任何人都没有帮助
    • 0 &lt; int(x) &lt;= 9x = '3.14'x = True 为真。
    【解决方案6】:

    虽然你的问题有很多答案,但是,恕我直言,我相信使用它们可能会出现一些错误。

    其中之一是使用 x.isdigit() ,这行得通!但只是为了字符串!但是如果我们想检查其他类型,比如浮点数怎么办?另一个问题是,使用这种方法不适用于某些数字,例如 12.0。对!。这是一个自然数,但 pyhton 会发现它是一个浮点数。所以我认为我们可以使用这个函数来检查自然数:

    def checkNatNum(n):
        if str(n).isdigit() and float(n) == int(n) and int(n) > 0:
            return True
        else:
            return False
    

    我向你保证,这会很好地完成这个过程。

    【讨论】:

      猜你喜欢
      • 2013-12-04
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多