3

我用python写了这个函数:

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

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

编辑:is_number_likeTrue在传递字符串时返回 - 这是我不想成为的。我想要一个函数,只要将False类似文本的值作为参数传递,它就会返回。有办法吗?

也许:

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

会更好?

或者可能:

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没有错误吗?

附言。我已经读过这个: 如何检查字符串是否为数字(浮点数)?

4

4 回答 4

2

之间有区别float(..)int(..)

float(..)将尝试解析string或任何具有__float__方法的对象。比如intfloatcomplex一个__float__方法。您也可以为自定义类定义此类方法。

如果您打算将复数转换为 a float(..),则会出错:

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

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

>>> class Foo:
...     def __float__(self):
...         return 2j
... 
>>> float(Foo())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __float__ returned non-float (type complex)

所以一个简单的float(..)尝试就足够了:

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

Python 中的大多数类似数字的numpy.int16类型(如)**支持这种__float__方法。

int(..)另一方面,使用string 和使用__int__method。同样,如果您调用int(..),则结果保证为int.

所以在中,你可以使用两个检查:一个 forfloat(..)和一个 for 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类型(猜猜看,它与 .x 一起使用__long__)。

于 2017-07-12T16:09:06.317 回答
2

如果我理解正确,您实际上要做的是找出对象是否以类似“数字”的方式表现(例如,您可以附加+1到它)。如果是这样,有一个更简单的方法:

>>> 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
于 2017-07-12T16:29:07.100 回答
1

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

除了“int 或 float 可转换”之外的任何其他对象都会引发 ValueError.

要使自定义类中的对象“可转换”,必须定义适当的“dunders” __int__,并且__float__请参阅 doc

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

def is_real_number(number):
    try:
        int(number)
    except TypeError, ValueError:
        return False
    return True
于 2017-07-12T16:16:29.723 回答
0

为什么不直接使用

any([isinstance(x, t) for t in [float, int, complex]])

您可以将类型列表修改为您需要的任何类型。

于 2017-07-12T16:19:01.713 回答