检查python对象是否可以解释为实数[python]

2024-06-02 07:14:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我用python编写了函数:

def is_number_like(x):
     try:
        int(x) + 1
    except:
        return False
    return True

如果我写float(x)int(x),有什么区别吗?或者+ 1部分在某些情况下有用吗?在

{t{cd5>要传递的是什么。我想要一个函数,它将在任何时候返回False作为参数传递一个类似文本的值。有办法吗?在

也许:

^{pr2}$

会更好吗?在

或者可能:

def is_number_like(x):
     try:
        float(x + 1) == float(x) + 1
    except:
        return False
    return True

我想写一个模块,它可以接受任何表现良好的数字类型,它代表一维实数(例如SimpleITK.sitkUInt8数字类型或numpy.int32等等…)。在

我担心可能会有库,在转换为int或float时不会抛出错误。例如,我可以想象这样的情况:

>>> z = SomeComplexType(1. + 2.j)
>>> z
(1+2j)
>>> z -= 2.j
>>> z
(1+0j)
>>> float(z) # does not raise an error
1.

这可能吗,我应该担心这种情况吗?在

所有设计良好的实数类型都会转换成float而不会出错吗?在

ps.我已经读过了: How do I check if a string is a number (float)?


Tags: 函数falsetrue类型numberreturnisdef
3条回答

{如果你能理解一个物体的行为是否正确。如果是这样,还有一种更简单的方法:

>>> from numbers import Number
>>> 
>>> my_complex_number = 3-2j
>>> my_stringy_number = "3.14"
>>>
>>> isinstance(my_complex_number, Number)
True
>>> isinstance(my_stringy_number, Number)
False

float(..)和{}之间有区别。在

float(..)将尝试解析string或任何具有__float__方法的对象。例如,intfloat和{}有一个__float__方法。也可以为自定义类定义此类方法。在

如果要将复数转换为float(..),则会出错:

>>> float(2+2j)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float

float(..)函数的结果保证是float:如果__float__方法返回一个非浮点值,它将引发一个TypeError

^{pr2}$

因此,一次简单的float(..)尝试就足够了:

def is_number_like(x):
     try:
        float(x)
        return True
    except TypeError, ValueError:
        return False

Python中的大多数numeric-like类型(比如numpy.int16)**支持这样的__float__方法。在

另一方面,int(..)str__int__方法一起工作。同样,如果您调用int(..),那么结果肯定是int。在

因此在中,可以使用两个检查:一个用于float(..),另一个用于int(..)

def is_number_like(x):
     try:
        int(x)
        return True
    except TypeError, ValueError:
        try:
            float(x)
            return True
        except TypeError, ValueError:
            return False

或者,如果要返回类似数字的对象:

def is_number_like(x):
     try:
        return int(x)
    except TypeError:
        try:
            return float(x)
        except TypeError:
            return None

(如果两次尝试都失败,则返回None)。在

请注意,在中,还有一个long类型(猜猜看,它与__long__一起工作)。在

在python中,复数不能直接转换为int或float,这将引发一个TypeError: can't convert complex to...。在

除“int或float convertible”之外的任何其他对象都将引发ValueError。在

要使自定义类中的对象成为“convertible”,必须定义适当的“dunders”__int__和{},see doc

因此,检查对象是否可以转换为实数的函数可以执行以下操作:

def is_real_number(number):
    try:
        int(number)
    except TypeError, ValueError:
        return False
    return True

相关问题 更多 >