【发布时间】:2015-01-01 01:30:19
【问题描述】:
现在我正在尝试制作一个简单的井字游戏,当用户为下一步选择棋盘扇区时,我需要检查输入是否为个位数的自然数。我不认为仅仅创建一个['1','2','3'...'9'] 列表并为此调用一个 in 语句是最理想的事情。你有什么建议吗?
【问题讨论】:
-
现在我至少知道所有可能的方法了。谢谢大家的回答!
标签: python string python-3.x input numbers
现在我正在尝试制作一个简单的井字游戏,当用户为下一步选择棋盘扇区时,我需要检查输入是否为个位数的自然数。我不认为仅仅创建一个['1','2','3'...'9'] 列表并为此调用一个 in 语句是最理想的事情。你有什么建议吗?
【问题讨论】:
标签: python string python-3.x input numbers
您可以检查字符串 x 是否为单个数字自然数,方法是检查字符串是否包含数字并且这些数字的等效整数在 1 到 9 之间,即
x.isdigit() and 1 <= int(x) <= 9
另外,如果 x.isdigit() 返回 false,则由于使用 and 的表达式,永远不会评估 int(x)(因为结果已知,所以没有必要)因此如果字符串不是一个数字。
【讨论】:
使用len 和str.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
【讨论】:
为什么不直接使用
>>> natural = tuple('123456789')
>>> '1' in natural
True
>>> 'a' in natural
False
>>> '12' in natural
False
检查您初始化一次的小元组中的成员身份非常高效,tuple 尤其优于 set,因为它针对少量项目进行了优化。使用len 和isdigit 太过分了。
【讨论】:
tuple 也比list 快(python 可以优化此成员资格检查,因为元组是不可变的)。两个函数调用必须更慢,但我没有做任何计时
string.digits[1:]
在控制台上进行操作可能会有所帮助:
>>> x=1
>>> x>0 and isinstance(x,int)
True
【讨论】:
我不知道人们为什么要把它推到一个新的水平。 简单来说自然数就可以写了,
int(x) > 0
对于范围问题:
0 < int(x) <= 9
显然范围内的数字是自然数。
【讨论】:
0 < int(x) <= 9 对x = '3.14' 和x = True 为真。
虽然你的问题有很多答案,但是,恕我直言,我相信使用它们可能会出现一些错误。
其中之一是使用 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
我向你保证,这会很好地完成这个过程。
【讨论】: