Python 更智能的十进制到数字转换方法
给定一个百分比,例如5.43%,称其为: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
- 十进制格式->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 < /代码>。嵌套的dictconvert2={'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 < /代码>。嵌套的dictconvert2={'num':{'num':1.,'dec':0.01},'dec':{'num':100.,'dec':1.}
给出了1000000个循环,每个循环最好3:197ns
。所以嵌套的速度稍微快一点。