给定百分比 - 例如,5.43% - 称其为:
两者之间的转换逻辑如下:
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查找的更加pythonic替代感兴趣。因为我会多次调用此转换,所以我更喜欢*不*使用逻辑运算符。 (我想......)
convert = {('num', 'num') : 1.,
('dec', 'dec') : 1.,
('num', 'dec') : 0.01,
('dec', 'num') : 100.
}
def converter(num, input_form='num', output_form='dec'):
return num * convert[(input_form, output_form)]
num = 5.43
print(converter(num))
这个问题太宽泛了吗?评论并让我知道,我会尝试磨练我正在寻找的东西,但坦率地说,我只是对看到其他实现感兴趣。基本上,我目前有一个基于类的实现,我想在实例化时建立self
的数字和小数形式,然后也使用方法中的函数。
答案 0 :(得分:1)
您还可以使用属性:
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
您可以找到有关属性here, for example
的更多信息答案 1 :(得分:1)
我目前有一个基于类的实现,我想在实例化中建立自我的数字和小数形式,然后也在方法中使用该函数。
如果您已经在使用基于类的方法,那么将转换包装到类的properties
而不是处理单独的转换字典似乎是最自然的。
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
答案 2 :(得分:1)
在这种情况下使用属性的替代方法 - 只要您知道 - 将定义两个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