Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更智能的十进制到数字转换方法_Python_Python 3.x - Fatal编程技术网

Python 更智能的十进制到数字转换方法

Python 更智能的十进制到数字转换方法,python,python-3.x,Python,Python 3.x,给定一个百分比,例如5.43%,称其为: 数字形式->5.43 十进制格式->0.0543 在两者之间转换的逻辑如下: input form output form operation ---------- ----------- --------- numeric numeric multiply by 1. decimal decimal multiply

给定一个百分比,例如5.43%,称其为:

  • 数字形式->5.43
  • 十进制格式->0.0543
在两者之间转换的逻辑如下:

input form      output form         operation
----------      -----------         ---------
numeric         numeric             multiply by 1.
decimal         decimal             multiply by 1.
numeric         decimal             multiply by 0.01
decimal         numeric             multiply by 100.
我对下面的dict查找有兴趣。因为我会多次调用这个转换,我宁愿*不*使用逻辑运算符。(我想……)


这个问题是否过于宽泛?请发表评论并让我知道,我将尝试深入了解我正在寻找的内容,但坦率地说,我只是对看到其他实现感兴趣。基本上,我目前有一个基于类的实现,我想在实例化时建立一个数字和十进制形式的
self
,然后也在方法中使用函数。

您还可以使用属性:

class Convertible:
    def __init(self, value, form='numeric'):
        if form == 'numeric':
            self._numeric = value
        elif form == 'decimal':
            self._numeric = value * 100
        else:
            raise ValueError("form must be 'numeric' or 'decimal'")

    @property
    def numeric(self):
        return self._numeric

    @numeric.setter
    def numeric(self, value):
        self._numeric = value

    @property
    def decimal(self):
        # for Python 2 compatibility, divide by a float
        # to avoid integer division if we have an integer 'numeric' value
        return self._numeric / 100.0

    @decimal.setter
    def decimal(self, value):
        self._numeric = value * 100
因此,您可以设置数字的数字形式或十进制形式,并透明地访问其中任何一种形式。在内部,我们只存储其中一个表单

您可以这样使用它:

val = Convertible()

val.numeric = 5.43
print(val.numeric)
# 5.43
print(val.decimal)
# 0.054299999999999994

val.decimal = 0.42
print(val.numeric)
# 42.0
print(val.decimal)
# 0.42

您可以找到有关属性的更多信息

您还可以使用属性:

class Convertible:
    def __init(self, value, form='numeric'):
        if form == 'numeric':
            self._numeric = value
        elif form == 'decimal':
            self._numeric = value * 100
        else:
            raise ValueError("form must be 'numeric' or 'decimal'")

    @property
    def numeric(self):
        return self._numeric

    @numeric.setter
    def numeric(self, value):
        self._numeric = value

    @property
    def decimal(self):
        # for Python 2 compatibility, divide by a float
        # to avoid integer division if we have an integer 'numeric' value
        return self._numeric / 100.0

    @decimal.setter
    def decimal(self, value):
        self._numeric = value * 100
因此,您可以设置数字的数字形式或十进制形式,并透明地访问其中任何一种形式。在内部,我们只存储其中一个表单

您可以这样使用它:

val = Convertible()

val.numeric = 5.43
print(val.numeric)
# 5.43
print(val.decimal)
# 0.054299999999999994

val.decimal = 0.42
print(val.numeric)
# 42.0
print(val.decimal)
# 0.42
您可以找到有关属性的更多信息

我目前有一个基于类的实现,我想在实例化时建立一个数字和十进制形式的self,然后在方法中也使用这个函数

如果您已经在使用基于类的方法,那么最自然的做法是将转换打包到类的
属性
,而不是处理单独的转换字典

class DecimalPercent:
    def __init__(self, value, form='decimal'):
        self._value = value/100 if form == 'percent' else value

    @property
    def decimal(self):
        return self._value

    @decimal.setter
    def decimal(self, value):
        self._value = value

    @property
    def percent(self):
        return self._value * 100

    @percent.setter
    def percent(self, value):
        self._value = value / 100
我目前有一个基于类的实现,我想在实例化时建立一个数字和十进制形式的self,然后在方法中也使用这个函数

如果您已经在使用基于类的方法,那么最自然的做法是将转换打包到类的
属性
,而不是处理单独的转换字典

class DecimalPercent:
    def __init__(self, value, form='decimal'):
        self._value = value/100 if form == 'percent' else value

    @property
    def decimal(self):
        return self._value

    @decimal.setter
    def decimal(self, value):
        self._value = value

    @property
    def percent(self):
        return self._value * 100

    @percent.setter
    def percent(self, value):
        self._value = value / 100

在本例中使用属性的另一种方法是定义两个
float
子类,并使用它们,如下所示:

class Num(float):
    pass

class Dec(float):
    pass

def converter(value):
    arg_type = Num if isinstance(value, Num) else Dec if isinstance(value, Dec) else None
    return value * (0.01 if arg_type is Num else 100 if arg_type is Dec else float('nan'))

print(converter(Num(5.43)))  # -> 0.0543
print(converter(Dec(0.12)))  # -> 12.0
print(converter(0.1618))     # -> nan
print(converter(42))         # -> nan

在本例中使用属性的另一种方法是定义两个
float
子类,并使用它们,如下所示:

class Num(float):
    pass

class Dec(float):
    pass

def converter(value):
    arg_type = Num if isinstance(value, Num) else Dec if isinstance(value, Dec) else None
    return value * (0.01 if arg_type is Num else 100 if arg_type is Dec else float('nan'))

print(converter(Num(5.43)))  # -> 0.0543
print(converter(Dec(0.12)))  # -> 12.0
print(converter(0.1618))     # -> nan
print(converter(42))         # -> nan

不,你很好。您可以尝试改用lambdas,因此您可以执行
返回convert[(input\u form,output\u form)](num)
,但我不建议这样做。但是,您可以使用嵌套的DICT,因此实际上将调用代码>转换[IpPuthField] [OutPutsFrime] < /C> >,我将考虑比元组索引更干净。当前的基于元组的实现给出:<代码> 1000000个循环,最好的3个:每个循环258个ns < /代码>。嵌套的dict
convert2={'num':{'num':1.,'dec':0.01},'dec':{'num':100.,'dec':1.}
给出了
1000000个循环,每个循环最好3:197ns
。所以嵌套的稍微快一点。不,你很好。您可以尝试改用lambdas,因此您可以执行
返回convert[(input\u form,output\u form)](num)
,但我不建议这样做。但是,您可以使用嵌套的DICT,因此实际上将调用代码>转换[IpPuthField] [OutPutsFrime] < /C> >,我将考虑比元组索引更干净。当前的基于元组的实现给出:<代码> 1000000个循环,最好的3个:每个循环258个ns < /代码>。嵌套的dict
convert2={'num':{'num':1.,'dec':0.01},'dec':{'num':100.,'dec':1.}
给出了
1000000个循环,每个循环最好3:197ns
。所以嵌套的速度稍微快一点。