我定义了以下函数来测试输入是否为正int。我打算使用eval(raw_input(“...”)),这就是为什么try-except部分在那里:
def is_ok(x): # checks if x is a positive integer
is_int = False
is_pos = False
try:
if type(eval(x)) == int:
is_int = True
if x > 0:
is_pos = True
else:
pass
else:
pass
except NameError:
is_int = False
print "not even a number!"
return is_int, is_pos
如果我尝试传递一个正数int,它将返回True,True如预期的那样。 它返回False,False和非数字的错误消息。
然而,对于负数,它仍然返回True以检查它是否为正数。 例如,在函数后添加:
is_int, is_pos = is_ok("-9")
print is_int, is_pos
运行打印: 真实
无法理解为什么会这样,并且会爱你的帮助。 即使有更有效的方法来实现这一点,我仍然想了解为什么它产生True True。 谢谢!
答案 0 :(得分:6)
稍微缩短一下:
def is_ok(x):
is_int = False
is_pos = False
try:
x = float(x)
# Check if the number is integer or not
is_int = x.is_integer()
if x > 0:
is_pos = True
except ValueError:
print("not even a number!")
return is_int, is_pos
要解释这是如何工作的,您可以将字符串传递给int()
以将其转换为整数。但是,传递无效字符串(如foo
)会引发ValueError
。我们可以捕获它并向用户显示我们的"not even a number!"
消息。比使用eval()
更安全。
尝试not to use eval()
,除非您完全信任输入。
删除所有变量你也可以做到:
def is_ok(x):
try:
# Check if is an integer and greater than 0
return float(x).is_integer(), float(x) > 0
except ValueError:
print("not even a number!")
return False, False
你原来的问题是,即使是负数也会返回True, True
。这里的问题是,当你使用type(eval(x)) == int
时,你没有使x
成为一个整数对象。当您尝试将字符串与稍后的整数(if x > 0
)进行比较时会产生意外的效果:
In [9]: "twenty" > 0
Out[9]: True
您可以在此very detailed answer中详细了解这种奇怪的行为。
如果您要将x
重新定义为变量:
try:
x = eval(x)
if type(x) == int:
然后,当您进行比较时,它会表现得更好,并为True, False
返回"-9"
。
答案 1 :(得分:3)
这一切看起来都很复杂,在eval
上使用raw_input
会带来安全风险 - 用户可以输入他们喜欢的任何内容。
相反,尝试类似:
def is_ok(s):
try:
i = int(s)
except ValueError:
return False, False
else:
return True, i >= 0
示例输入和输出:
>>> for s in ["foo", "9", "-9"]:
print s, is_ok(s)
foo (False, False)
9 (True, True)
-9 (True, False)
您的错误在这里:
if x > 0:
记住x
仍然是一个字符串,在Python 2.x中,所有字符串都将比较> 0
。
答案 2 :(得分:0)
>>> def is_int_positive(n):
... try:
... if n == 0:
... return True, 'Positive'
... elif max(0,int(n)):
... return True, 'Positive'
... else:
... return True, 'Negative'
... except:
... return False, 'Error'
...
>>> for i in [1, 0, -23, 23, 'a']:
... print i, is_int_positive(i)
...
1 (True, 'Positive')
0 (True, 'Positive')
-23 (True, 'Negative')
23 (True, 'Positive')
a (False, 'Error')
>>>
答案 3 :(得分:0)
为什么不让它变得简单
def is_positive(number):
if number > 0:
return True
else:
if number <= 0:
return False
答案 4 :(得分:-1)
def is_ok(x):
try:
return type(x)==int, int(x)>0
except ValueError:
return False, False
或者:
def is_ok(x):
try:
return type(x)==int, 'Positive' if int(x)>0 else 'Negative'
except ValueError:
return False, 'Neither'