【问题标题】:Checking user input using isnan function of NumPy使用 NumPy 的 isnan 函数检查用户输入
【发布时间】:2012-01-20 09:45:04
【问题描述】:

我正在尝试使用 NumPy 检查用户输入是否为数字。我试过使用:

import numpy as np

a = input("\n\nInsert A: ")

if np.isnan(a):
    print 'Not a number...'
else:
    print "Yep,that's a number"

单独 t 工作正常,但是当我将它嵌入到函数中时,例如在这种情况下:

import numpy as np

def test_this(a):   
    if np.isnan(a):
        print '\n\nThis is not an accepted type of input for A\n\n'
        raise ValueError
    else:
        print "Yep,that's a number"

a = input("\n\nInsert A: ")

test_this(a)

然后我得到一个NotImplementationError 说它没有针对这种类型实现,谁能解释这怎么不起作用?

【问题讨论】:

  • 1.避免使用from numpy import *,您可以使用import numpy as np,然后使用np.isnan(),等等。 2.不要和True比较,直接用if np.isnan(a)代替。 3. input() eval(raw_input(prompt)) 这很可能不是你想要的。

标签: python numpy input python-2.x notimplementedexception


【解决方案1】:

“非数字”或“NaN”是根据 IEEE-754 标准的一种特殊浮点值。函数numpy.isnan()math.isnan() 测试给定浮点数是否具有此特殊值(或几个“NaN”值之一)。将浮点数以外的任何内容传递给这些函数之一会导致 TypeError

要进行您想做的那种输入检查,您不应该使用input()。相反,使用raw_input(),try: 将返回的字符串转换为float,如果失败则处理错误。

例子:

def input_float(prompt):
    while True:
        s = raw_input(prompt)
        try:
            return float(s)
        except ValueError:
            print "Please enter a valid floating point number."

作为@J.F.塞巴斯蒂安指出,

input()eval(raw_input(prompt)),这很可能不是你想要的。

或者更明确地说,raw_input 传递一个字符串,一旦发送到eval,它将被评估和处理,就好像它是带有输入值而不是输入字符串本身的命令。

【讨论】:

    【解决方案2】:
    a = raw_input("\n\nInsert A: ")
    
    try: f = float(a)
    except ValueError:
         print "%r is not a number" % (a,)
    else:
         print "%r is a number" % (a,)
    

    【讨论】:

      【解决方案3】:

      在 Python 中检查用户输入是否为有效数字的最全面的方法之一是尝试将其转换为浮点值并捕获异常。

      如 cmets 和其他答案中所述,对 NaN 的检查与有效的用户数字输入无关 - 相反,它检查数字对象是否具有 Not a Number 的特殊值。

      def check_if_numeric(a):
         try:
             float(a)
         except ValueError:
             return False
         return True
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-30
        • 2018-04-03
        • 1970-01-01
        • 2013-08-12
        • 2017-05-08
        • 2019-03-20
        • 1970-01-01
        • 2023-03-18
        相关资源
        最近更新 更多