【问题标题】:Skipped Elif Statements跳过的 Elif 语句
【发布时间】:2019-11-12 01:35:56
【问题描述】:

我写了一个温度转换程序。除了开尔文到摄氏度、开尔文到华氏度以及反之亦然的转换之外,一切都运行良好。我已经尝试了很多不同的代码来查看它是否会被修复,但都是徒劳的。请指教。下面是整个代码。您将在名为 ToTemp() 的第二个函数中找到问题区域;如果您输入下限温度缩写或上限(即 34F 或 34f),前几条语句效果很好。但其他任何事情都无法发挥作用。

'''
Python program to convert temperature from Celsius,
Fahrenheit or Kelvin. These next lines of code (loc) introduce
the program and ask user for temperature to be converted.
'''
import sys # to exit when user makes error.

print ("\n****Welcome to your own advanced temperature conversion application!****\n")
print ("^^^What would you like to convert?^^^")
print ("Type 'C' for Celsius, 'F' for Fahrenheit and 'K' for Kelvin \
 after entering digits. (Ex: '34C')\n")
user_temp1 = input('--> ')

# function to determine which temperature user wishes to convert from.
def FromTemp(user_temp):

    if user_temp1[-1] == 'C' or user_temp1[-1] == 'c':
        print ("You wish to convert from Celsius.")

    elif user_temp1[-1] == 'F' or user_temp1[-1] == 'f':
        print ("You wish to convert from Fahrenheit.")

    elif user_temp1[-1] == 'K' or user_temp1[-1] == 'k':
        print ("Ah! Yes, the elusive Kelvin!")

    else:
        print ("You must think me mad; I only allow C, F and K.")
        sys.exit() # exits when user makes mistake.

FromTemp(user_temp1)

# asks user for desired conversion rate.
print ("\n^^^What would you like to convert to? (Enter 'C', 'F' or 'K')^^^\n")
destin_temp = input("--> ")

# stripping the numbers from the temperature symbol.
real_temp = user_temp1[:- 1]
raw_temp = int(real_temp)

# function to make conversion from and to appropriate thermal unit.
def ToTemp(raw_temp):

    if destin_temp == 'C' or destin_temp == 'c' and user_temp1[-1] == 'F' or user_temp1[-1] == 'f':
        f_to_c = round(float((raw_temp - 32) * 5/9), 2)
        print (real_temp, "degrees Fahrenheit is", f_to_c, "degrees Celsius.\n")
        print ("****Thank you for stopping by!****\n") #good

    elif destin_temp == 'F' or destin_temp == 'f' and user_temp1[-1] == 'C' or user_temp1[-1] == 'c':
        c_to_f = round(float(raw_temp * (9/5) + 32), 2)
        print (real_temp, "degrees Celsius is", c_to_f, "degrees Fahrenheit.")
        print ("****Thank you for stopping by!****\n") #good

    elif destin_temp == 'C' or destin_temp == 'c' and user_temp1[-1] == 'K' or user_temp1[-1] == 'k':
        k_to_c = round(float(raw_temp - 273.15), 2)
        print (real_temp, "degrees Kelvin is", k_to_c, "degrees Celsius.")
        print ("****Thank you for stopping by!****\n") # doesn't work

    elif destin_temp == 'K' or destin_temp == 'k' and user_temp1[-1] == 'C' or user_temp1[-1] == 'c':
        c_to_k = round(float(raw_temp + 273.15), 2)
        print (real_temp, "degrees Celsius is", c_to_k, "degrees Kelvin.")
        print ("****Thank you for stopping by!****\n") # doesn't work

    elif destin_temp == 'F' or destin_temp == 'f' and user_temp1[-1] == 'K' or user_temp1[-1] == 'k':
        k_to_f = round(float((raw_temp - 273.15) * (9/5) + 32), 2)
        print (real_temp, "degrees Kelvin is", k_to_f, "degrees Fahrenheit.")
        print ("****Thank you for stopping by!****\n") # doesn't work

    elif destin_temp == 'K' or destin_temp == 'k' and user_temp1[-1] == 'F' or user_temp1[-1] == 'f':
        f_to_k = round(float(raw_temp - 32 *(5/9) + 273.15), 2)
        print (real_temp, "degrees Fahrenheit is", k_to_f, "degrees Kelvin.")
        print ("****Thank you for stopping by!****\n") # doesn't work

    else:
        print("You made a mistake somewhere. Try again later.")
        sys.exit()

ToTemp(raw_temp)

【问题讨论】:

  • 添加一些括号应该可以解决您的问题。
  • @iz_ 我应该在哪里包含这些括号?我已经查看这些代码几个小时了;我相信我现在会错过最明显的错误:'(
  • @manveti 它没有

标签: python if-statement


【解决方案1】:

我宁愿重写这个:

if destin_temp == 'C' or destin_temp == 'c' and user_temp1[-1] == 'F' or user_temp1[-1] == 'f':

这样:

destin_temp = destin_temp.lower()
user_temp = user_temp1[-1].lower()
if destin_temp == 'c' and user_temp == 'f':

将所有内容转换为小写(或大写)并处理更简单的表达式。

【讨论】:

    【解决方案2】:

    将华氏度转换为开尔文时会出现错误,因为在最后一个elif 中,您计算​​了f_to_k,但打印了k_to_f。您的错误来自您的这部分代码。此外,最好使用括号来明确条件。这是最终的代码。

    '''
    Python program to convert temperature from Celsius,
    Fahrenheit or Kelvin. These next lines of code (loc) introduce
    the program and ask user for temperature to be converted.
    '''
    import sys # to exit when user makes error.
    
    print ("\n****Welcome to your own advanced temperature conversion application!****\n")
    print ("^^^What would you like to convert?^^^")
    print ("Type 'C' for Celsius, 'F' for Fahrenheit and 'K' for Kelvin \
     after entering digits. (Ex: '34C')\n")
    user_temp1 = input('--> ')
    
    # function to determine which temperature user wishes to convert from.
    def FromTemp(user_temp):
    
        if user_temp1[-1] == 'C' or user_temp1[-1] == 'c':
            print ("You wish to convert from Celsius.")
    
        elif user_temp1[-1] == 'F' or user_temp1[-1] == 'f':
            print ("You wish to convert from Fahrenheit.")
    
        elif user_temp1[-1] == 'K' or user_temp1[-1] == 'k':
            print ("Ah! Yes, the elusive Kelvin!")
    
        else:
            print ("You must think me mad; I only allow C, F and K.")
            sys.exit() # exits when user makes mistake.
    
    FromTemp(user_temp1)
    
    # asks user for desired conversion rate.
    print ("\n^^^What would you like to convert to? (Enter 'C', 'F' or 'K')^^^\n")
    destin_temp = input("--> ")
    
    # stripping the numbers from the temperature symbol.
    real_temp = user_temp1[:- 1]
    raw_temp = int(real_temp)
    
    # function to make conversion from and to appropriate thermal unit.
    def ToTemp(raw_temp):
    
        if (destin_temp == 'C' or destin_temp == 'c') and (user_temp1[-1] == 'F' or user_temp1[-1] == 'f'):
            f_to_c = round(float((raw_temp - 32) * 5/9), 2)
            print (real_temp, "degrees Fahrenheit is", f_to_c, "degrees Celsius.\n")
            print ("****Thank you for stopping by!****\n") #good
    
        elif (destin_temp == 'F' or destin_temp == 'f') and (user_temp1[-1] == 'C' or user_temp1[-1] == 'c'):
            c_to_f = round(float(raw_temp * (9/5) + 32), 2)
            print (real_temp, "degrees Celsius is", c_to_f, "degrees Fahrenheit.")
            print ("****Thank you for stopping by!****\n") #good
    
        elif (destin_temp == 'C' or destin_temp == 'c') and (user_temp1[-1] == 'K' or user_temp1[-1] == 'k'):
            k_to_c = round(float(raw_temp - 273.15), 2)
            print (real_temp, "degrees Kelvin is", k_to_c, "degrees Celsius.")
            print ("****Thank you for stopping by!****\n") # doesn't work
    
        elif (destin_temp == 'K' or destin_temp == 'k') and (user_temp1[-1] == 'C' or user_temp1[-1] == 'c'):
            c_to_k = round(float(raw_temp + 273.15), 2)
            print (real_temp, "degrees Celsius is", c_to_k, "degrees Kelvin.")
            print ("****Thank you for stopping by!****\n") # doesn't work
    
        elif (destin_temp == 'F' or destin_temp == 'f') and (user_temp1[-1] == 'K' or user_temp1[-1] == 'k'):
            k_to_f = round(float((raw_temp - 273.15) * (9/5) + 32), 2)
            print (real_temp, "degrees Kelvin is", k_to_f, "degrees Fahrenheit.")
            print ("****Thank you for stopping by!****\n") # doesn't work
    
        elif (destin_temp == 'K' or destin_temp == 'k') and (user_temp1[-1] == 'F' or user_temp1[-1] == 'f'):
            f_to_k = round(float(raw_temp - 32 *(5/9) + 273.15), 2)
            print (real_temp, "degrees Fahrenheit is", f_to_k, "degrees Kelvin.")
            print ("****Thank you for stopping by!****\n") # doesn't work
    
        else:
            print("You made a mistake somewhere. Try again later.")
            sys.exit()
    
    ToTemp(raw_temp)
    

    更新:这是一个组织得更好的代码。

    '''
    Python program to convert temperature from Celsius,
    Fahrenheit or Kelvin. These next lines of code (loc) introduce
    the program and ask user for temperature to be converted.
    '''
    import sys # to exit when user makes error.
    
    
    # function to determine which temperature user wishes to convert from.
    def FromTemp(user_temp):
        if user_temp1[-1] == 'C' or user_temp1[-1] == 'c':
            print ("You wish to convert from Celsius.")
        elif user_temp1[-1] == 'F' or user_temp1[-1] == 'f':
            print ("You wish to convert from Fahrenheit.")
        elif user_temp1[-1] == 'K' or user_temp1[-1] == 'k':
            print ("Ah! Yes, the elusive Kelvin!")
        else:
            print ("You must think me mad; I only allow C, F and K.")
            sys.exit() # exits when user makes mistake.
    
    # function to make conversion from and to appropriate thermal unit.
    def ToTemp(raw_temp):
        if destin_temp.lower() == 'c' and user_temp1[-1].lower() == 'f':
            f_to_c = round(float((raw_temp - 32) * 5/9), 2)
            print (real_temp, "degrees Fahrenheit is", f_to_c, "degrees Celsius.\n")
            print ("****Thank you for stopping by!****\n") #good
        elif destin_temp.lower() == 'f' and user_temp1[-1].lower() == 'c':
            c_to_f = round(float(raw_temp * (9/5) + 32), 2)
            print (real_temp, "degrees Celsius is", c_to_f, "degrees Fahrenheit.")
            print ("****Thank you for stopping by!****\n") #good
        elif destin_temp.lower() == 'c' and user_temp1[-1].lower() == 'k':
            k_to_c = round(float(raw_temp - 273.15), 2)
            print (real_temp, "degrees Kelvin is", k_to_c, "degrees Celsius.")
            print ("****Thank you for stopping by!****\n") # doesn't work
        elif destin_temp.lower() == 'k' and user_temp1[-1].lower() == 'c':
            c_to_k = round(float(raw_temp + 273.15), 2)
            print (real_temp, "degrees Celsius is", c_to_k, "degrees Kelvin.")
            print ("****Thank you for stopping by!****\n") # doesn't work
        elif destin_temp.lower() == 'f' and user_temp1[-1].lower() == 'k':
            k_to_f = round(float((raw_temp - 273.15) * (9/5) + 32), 2)
            print (real_temp, "degrees Kelvin is", k_to_f, "degrees Fahrenheit.")
            print ("****Thank you for stopping by!****\n") # doesn't work
        elif destin_temp.lower() == 'k' and user_temp1[-1].lower() == 'f':
            f_to_k = round(float(raw_temp - 32 *(5/9) + 273.15), 2)
            print (real_temp, "degrees Fahrenheit is", f_to_k, "degrees Kelvin.")
            print ("****Thank you for stopping by!****\n") # doesn't work
        else:
            print("You made a mistake somewhere. Try again later.")
            sys.exit()
    
    
    if __name__ == "__main__":
    
        print ("\n****Welcome to your own advanced temperature conversion application!****\n")
        print ("^^^What would you like to convert?^^^")
        print ("Type 'C' for Celsius, 'F' for Fahrenheit and 'K' for Kelvin \
         after entering digits. (Ex: '34C')\n")
        user_temp1 = input('--> ')
    
        FromTemp(user_temp1)
    
        # asks user for desired conversion rate.
        print ("\n^^^What would you like to convert to? (Enter 'C', 'F' or 'K')^^^\n")
        destin_temp = input("--> ")
    
        # stripping the numbers from the temperature symbol.
        real_temp = user_temp1[:- 1]
        raw_temp = int(real_temp)
    
        ToTemp(raw_temp)
    

    【讨论】:

      【解决方案3】:

      Python 并没有像你想象的那样解释你的 and/or 语句。

      您将其视为(1 或 2)和(3 或 4):

      但是 python 并没有这样看待它。它正在读取 1 或(2 和 3)或 4:

      通过使用 .upper() 命令压缩代码来清理代码可以解决您的问题。

      '''
      Python program to convert temperature from Celsius,
      Fahrenheit or Kelvin. These next lines of code (loc) introduce
      the program and ask user for temperature to be converted.
      '''
      import sys # to exit when user makes error.
      
      print ("\n****Welcome to your own advanced temperature conversion application!****\n")
      print ("^^^What would you like to convert?^^^")
      print ("Type 'C' for Celsius, 'F' for Fahrenheit and 'K' for Kelvin \
       after entering digits. (Ex: '34C')\n")
      user_temp1 = input('--> ')
      
      # function to determine which temperature user wishes to convert from.
      def FromTemp(user_temp):
      
          if user_temp1[-1].upper() == 'C':
              print ("You wish to convert from Celsius.")
      
          elif user_temp1[-1].upper() == 'F':
              print ("You wish to convert from Fahrenheit.")
      
          elif user_temp1[-1].upper() == 'K':
              print ("Ah! Yes, the elusive Kelvin!")
      
          else:
              print ("You must think me mad; I only allow C, F and K.")
              sys.exit() # exits when user makes mistake.
      
      FromTemp(user_temp1)
      
      # asks user for desired conversion rate.
      print ("\n^^^What would you like to convert to? (Enter 'C', 'F' or 'K')^^^\n")
      destin_temp = input("--> ")
      
      # stripping the numbers from the temperature symbol.
      real_temp = user_temp1[:- 1]
      raw_temp = int(real_temp)
      
      # function to make conversion from and to appropriate thermal unit.
      def ToTemp(raw_temp):
      
          if destin_temp.upper() == 'C' and user_temp1[-1].upper() == 'F':
              f_to_c = round(float((raw_temp - 32) * 5/9), 2)
              print (real_temp, "degrees Fahrenheit is", f_to_c, "degrees Celsius.\n")
              print ("****Thank you for stopping by!****\n") #good
      
          elif destin_temp.upper() == 'F' and user_temp1[-1].upper() == 'C':
              c_to_f = round(float(raw_temp * (9/5) + 32), 2)
              print (real_temp, "degrees Celsius is", c_to_f, "degrees Fahrenheit.")
              print ("****Thank you for stopping by!****\n") #good
      
          elif destin_temp.upper() == 'C' and user_temp1[-1].upper() == 'K':
              k_to_c = round(float(raw_temp - 273.15), 2)
              print (real_temp, "degrees Kelvin is", k_to_c, "degrees Celsius.")
              print ("****Thank you for stopping by!****\n") # doesn't work
      
          elif destin_temp.upper() == 'K' and user_temp1[-1].upper() == 'C':
              c_to_k = round(float(raw_temp + 273.15), 2)
              print (real_temp, "degrees Celsius is", c_to_k, "degrees Kelvin.")
              print ("****Thank you for stopping by!****\n") # doesn't work
      
          elif destin_temp.upper() == 'F' and user_temp1[-1].upper() == 'K':
              k_to_f = round(float((raw_temp - 273.15) * (9/5) + 32), 2)
              print (real_temp, "degrees Kelvin is", k_to_f, "degrees Fahrenheit.")
              print ("****Thank you for stopping by!****\n") # doesn't work
      
          elif destin_temp.upper() == 'K' and user_temp1[-1].upper() == 'F':
              f_to_k = round(float(raw_temp - 32 *(5/9) + 273.15), 2)
              print (real_temp, "degrees Fahrenheit is", f_to_k, "degrees Kelvin.")
              print ("****Thank you for stopping by!****\n") # doesn't work
      
          else:
              print("You made a mistake somewhere. Try again later.")
              sys.exit()
      

      【讨论】:

      • and 运算符的优先级高于 or 运算符。不是(((1 or 2) and 3) or 4),是1 or (2 and 3) or 4
      • 哈哈,我在提交后五秒钟就顿悟了:P derps
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多