如何使用 "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

简而言之,iconvoconv 字典用一个简单的字典查找替换了您的 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 不完全是输入数字!)但是您的代码强制 floats 到 ints 显然会不必要地失去更多的精度。

注意函数本身 print 什么都没有,它只是 return 一个数字。一种常见的设计是将可重用功能与用户界面设计分开,因此将结果显示给用户(或做任何您想用它做的其他事情)的责任落在调用者身上。