[英]How can I make a def function with my "if" statements?
我们被要求创建一个名为温度转换的函数,它接受一个称为温度的整数参数、一个称为输入单元的辅助字符串参数和一个称为输出单元的第三个字符串参数。 输入单位指定温度值的单位。 此函数应将温度值转换并返回目标单位中指定的单位。 两个单位参数都应为“C”、“K”或“F”之一。
我想出了一堆if
语句并且它有效,但我无法创建有效的函数。
input_unit, target_unit = input("Input the temperature and the unit to convert it to: [e.g. 45c f > valid Units: C,K,F: ").split()
degree = int(input_unit[:-1])
i_unit = input_unit[-1].upper()
o_unit = target_unit.upper()
if i_unit == "C" and o_unit == "F":
result = int((1.8 * degree) + 32)
print("{:0.2f}°{} ⇒ {:0.2f}°{}".format(degree,i_unit,result,o_unit))
elif i_unit == "C" and o_unit == "K":
result = int(degree + 273.15)
print("{:0.2f}°{} ⇒ {:0.2f}°{}".format(degree,i_unit,result,o_unit))
elif i_unit == "F" and o_unit == "K":
result = int(((degree * 1.8) +32)+ 273.15)
print("{:0.2f}°{} ⇒ {:0.2f}°{}".format(degree,i_unit,result,o_unit))
elif i_unit == "F" and o_unit == "C":
result = int((degree - 32) / 1.8)
print("{:0.2f}°{} ⇒ {:0.2f}°{}".format(degree,i_unit,result,o_unit))
elif i_unit == "K" and o_unit == "C":
result = int(degree - 273.15)
print("{:0.2f}°{} ⇒ {:0.2f}°{}".format(degree,i_unit,result,o_unit))
elif i_unit == "K" and o_unit == "F":
result = int(((degree - 273.15) - 32) / 1.8)
print("{:0.2f}°{} ⇒ {:0.2f}°{}".format(degree,i_unit,result,o_unit))
else:
while True:
input_unit, target_unit = input("Input the temperature and the unit to convert it to?: ").split()
if input_unit[-1].upper() != "C" or target_unit.upper() != "F":
print("You enterd an invalid unit. Please enter again: ")
你可以使用这个功能
def convert(degree, i_unit, o_unit):
if i_unit == "C" and o_unit == "F":
result = int((1.8 * degree) + 32)
print("{:0.2f}°{} ⇒ {:0.2f}°{}".format(degree,i_unit,result,o_unit))
elif i_unit == "C" and o_unit == "K":
result = int(degree + 273.15)
print("{:0.2f}°{} ⇒ {:0.2f}°{}".format(degree,i_unit,result,o_unit))
elif i_unit == "F" and o_unit == "K":
result = int(((degree * 1.8) +32)+ 273.15)
print("{:0.2f}°{} ⇒ {:0.2f}°{}".format(degree,i_unit,result,o_unit))
elif i_unit == "F" and o_unit == "C":
result = int((degree - 32) / 1.8)
print("{:0.2f}°{} ⇒ {:0.2f}°{}".format(degree,i_unit,result,o_unit))
elif i_unit == "K" and o_unit == "C":
result = int(degree - 273.15)
print("{:0.2f}°{} ⇒ {:0.2f}°{}".format(degree,i_unit,result,o_unit))
elif i_unit == "K" and o_unit == "F":
result = int(((degree - 273.15) - 32) / 1.8)
print("{:0.2f}°{} ⇒ {:0.2f}°{}".format(degree,i_unit,result,o_unit))
else:
while True:
input_unit, target_unit = input("Input the temperature and the unit to convert it to?: ").split()
if input_unit[-1].upper() != "C" or target_unit.upper() != "F":
print("You enterd an invalid unit. Please enter again: ")
在这里,我建议您分几个步骤分解程序,首先询问温度,然后使用函数进行转换,然后显示结果。
def temperatureConversions(degree, i_unit, o_unit):
if i_unit == "C" and o_unit == "F":
return int((1.8 * degree) + 32)
elif i_unit == "C" and o_unit == "K":
return int(degree + 273.15)
elif i_unit == "F" and o_unit == "K":
return int(((degree * 1.8) +32)+ 273.15)
elif i_unit == "F" and o_unit == "C":
return int((degree - 32) / 1.8)
elif i_unit == "K" and o_unit == "C":
return int(degree - 273.15)
elif i_unit == "K" and o_unit == "F":
return int(((degree - 273.15) - 32) / 1.8)
valueCorrect = False
while(not valueCorrect):
degree = input("Please enter a temperature (ex: 47C):\n")
o_unit = input("Please enter the output unit desired(ex: C, F, K):")
if(degree[:-1].isdigit()):
i_unit, degree = degree[-1], int(degree[:-1])
if(i_unit and o_unit in ['C', 'F', 'K']):
valueCorrect = True
else:
print("Please write correct values of unit !")
else:
print("Please write correct values of temperature !")
resultConversion = temperatureConversions(degree, i_unit, o_unit)
print("{:0.2f}°{} ⇒ {:0.2f}°{}".format(degree,i_unit,resultConversion,o_unit))
向我确认它对你有用。
一种更简单的方法是将输入转换为规范单位(例如,K),然后相应地转换为所需的输出单位。
def c_to_k(degrees: float) -> float:
return degrees + 273.15
def k_to_c(degrees: float) -> float:
return degrees - 273.15
def f_to_k(degrees: float) -> float:
return degrees * 1.8 + 32 + 273.15
def k_to_f(degrees: float) -> float:
return (degrees - 273.15 - 32) / 1.8
iconv = {
"c": c_to_k,
"f": f_to_k
}
oconv = {
"c": k_to_c,
"f": k_to_f
}
def temperature_conversion(
temperature: float,
input_unit: str,
output_unit: str):
input_unit = input_unit.lower()
if input_unit != "k":
temperature = iconv[input_unit](temperature)
output_unit = output_unit.lower()
if output_unit != "k":
temperature = oconv[output_unit](temperature)
return temperature
简而言之, iconv
和oconv
字典将if
语句替换为简单的字典查找,该字典查找返回要调用的函数对象以执行规范转换。
根据您的受众,您可能希望添加错误检查以在传入无效单元时引发比KeyError
更详细的异常。
如果这看起来太复杂了,那么更简单的实现可能会避免字典查找,而只需使用if
语句首先将输入转换为规范单位,然后再将其转换为所需的输出单位。 在这种情况下,可以通过将规范单位更改为 C 来简化代码,但是:
if input_unit == "f":
temperature = (temperature - 32) / 1.8
elif input_unit == "k":
temperature -= 273.15
if output_unit == "k":
temperature += 273.15
elif output_unit == "f":
temperature = temperature * 1.8 + 32
如果您需要高精度的结果,您可能希望避免通过两次单独的计算来进行单位之间的转换,因为浮点错误会加重并降低结果的准确性。 在这种情况下,您的原始代码的复杂性基本上无法避免。(也许另见Is floating point math broken? Converting Fahrenheit to Fahrenheit 有点可能不会准确返回输入数字!)但是您的代码强制float
s 为int
s 显然会不必要地损失更多的精度。
注意函数本身不print
任何东西,它只是返回一个数字。 一种常见的设计是将可重用功能与用户界面设计分开,因此向用户显示结果(或做任何其他你想做的事情)的责任落在调用者身上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.