class TemperatureConverter:
def __init__(self):
self.conversion_factors = {
'CtoF': (lambda c: c * 9/5 + 32),
'FtoC': (lambda f: (f - 32) * 5/9),
'CtoK': (lambda c: c + 273.15),
'KtoC': (lambda k: k - 273.15),
'FtoK': (lambda f: (f - 32) * 5/9 + 273.15),
'KtoF': (lambda k: (k - 273.15) * 9/5 + 32)
}
def convert(self, value, from_unit, to_unit):
key = from_unit + 'to' + to_unit
if key in self.conversion_factors:
return self.conversion_factors[key](value)
else:
raise ValueError("Invalid conversion units")
测试代码
converter = TemperatureConverter()
测试转换
print(converter.convert(100, 'C', 'F')) # 期望输出: 212.0
print(converter.convert(32, 'F', 'C')) # 期望输出: 0.0
print(converter.convert(0, 'C', 'K')) # 期望输出: 273.15
print(converter.convert(273.15, 'K', 'C')) # 期望输出: 0.0
复杂场景测试
print(converter.convert(100, 'C', 'K')) # 期望输出: 373.15
print(converter.convert(-40, 'F', 'C')) # 期望输出: -40.0
print(converter.convert(-273.15, 'C', 'K')) # 期望输出: 0.0
错误处理测试
print(converter.convert(100, 'C', 'X')) # 期望输出: ValueError
上面的代码定义了一个温度转换器类 TemperatureConverter,它可以在摄氏度(C)、华氏度(F)和开尔文(K)之间进行转换。请给出优化建议:
存在的问题如下:
- 缺乏输入值验证:当传入非数字或无效的字符串时,程序可能会抛出异常或产生意外结果。
- 未处理的边界条件:例如,处理极端温度值时可能会出现问题。
- 错误的错误处理:在最后一个测试用例中,当输入无效的单位组合时,应该抛出一个 ValueError,但代码中的实现可能不够健壮。
- 重复计算:转换过程中可能会有不必要的重复计算,优化潜力不大,但在更复杂的情况下可能会影响性能。
为了增强
TemperatureConverter
类的输入验证和错误处理,进行以下优化:from_unit
和to_unit
是有效的单位。下面是改进后的代码:
改进说明
validate_input
方法检查value
是否为数字,并验证单位是否有效。validate_input
方法中检查from_unit
和to_unit
是否在有效单位集合中。convert
方法中进一步细化了错误消息,使其更加清晰。to_unit
为K
,确保结果不会为负。通过改进,
TemperatureConverter
类现在更加健壮,可以更好地处理无效输入和极端值。