如何使用 "if" 语句创建 def 函数?
How can I make a def function with my "if" statements?
我们被要求创建一个名为 temperature conversions 的函数,该函数接受一个名为 temperature 的整数参数、一个名为 input unit 的辅助字符串参数和一个名为 output unit 的第三个字符串参数。输入单位指定温度值的单位。
此函数应将温度值转换 return 为目标单位中指定的单位。
两个单位参数应为“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
语句,其中 returns 函数对象调用以执行规范转换。
根据您的受众,您可能希望添加错误检查以在传入无效单元时引发比 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
如果您需要 high-precision 结果,您可能希望避免进行两次单独的计算以在单位之间进行转换,因为 floating-point 错误会复合并降低结果的准确性。在这种情况下,基本上无法避免原始代码的复杂性。(也许另请参阅 Is floating point math broken? 将华氏温度转换为华氏温度有点可能 return 不完全是输入数字!)但是您的代码强制 float
s 到 int
s 显然会不必要地失去更多的精度。
注意函数本身 print
什么都没有,它只是 return 一个数字。一种常见的设计是将可重用功能与用户界面设计分开,因此将结果显示给用户(或做任何您想用它做的其他事情)的责任落在调用者身上。
我们被要求创建一个名为 temperature conversions 的函数,该函数接受一个名为 temperature 的整数参数、一个名为 input unit 的辅助字符串参数和一个名为 output unit 的第三个字符串参数。输入单位指定温度值的单位。 此函数应将温度值转换 return 为目标单位中指定的单位。 两个单位参数应为“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
语句,其中 returns 函数对象调用以执行规范转换。
根据您的受众,您可能希望添加错误检查以在传入无效单元时引发比 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
如果您需要 high-precision 结果,您可能希望避免进行两次单独的计算以在单位之间进行转换,因为 floating-point 错误会复合并降低结果的准确性。在这种情况下,基本上无法避免原始代码的复杂性。(也许另请参阅 Is floating point math broken? 将华氏温度转换为华氏温度有点可能 return 不完全是输入数字!)但是您的代码强制 float
s 到 int
s 显然会不必要地失去更多的精度。
注意函数本身 print
什么都没有,它只是 return 一个数字。一种常见的设计是将可重用功能与用户界面设计分开,因此将结果显示给用户(或做任何您想用它做的其他事情)的责任落在调用者身上。