写了一个函数来确定一个数字是否为正整数,并为负数返回True

时间:2014-02-24 11:40:57

标签: python function exception-handling return

我定义了以下函数来测试输入是否为正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。 谢谢!

(这有点跟进:Python: How do I assign 2 values I return from a function with 1 input as values outside the function?

5 个答案:

答案 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'