为什么我的python程序给我一个错误,指出if / else语句中的变量未定义?

时间:2018-07-24 21:11:02

标签: python python-3.x

我正在尝试用Python 3编写一个将温度和距离从一个单位转换为另一个单位的代码。有人告诉我,我需要使用函数,并且用户将输入F(华氏温度),C(摄氏温度)或K(开氏温度),并且温度将从他们选择的任何值转换为F,C或K。我为每种情况编写了一个函数。用于从F转换的函数,从C转换的函数,以及从K转换的函数。我也针对英寸,英尺,码和英里进行了此操作。

因此,在我写完所有函数之后,我写了一条if,elif和else语句,我想根据用户的类型来调用每个函数。因此,如果用户输入“ F”,我希望它调用convert_from_F()函数,或者如果他们输入“ K”,我希望它使用convert_from_K(),或者如果用户键入“ inch”,我希望它使用convert_from_inch()函数。我认为实现此目的的方法是使用if,elif和else语句。但是,无论我键入什么内容,总是会收到错误消息:

NameError:名称'F'未定义

我会认为,如果发现用户未输入该特定指令,则迭代将继续经过每个语句。如果我(作为用户)输入“ F”,它也将不起作用。我不确定如何解决此代码。我从中错过了什么?

此外,我正在使用在线python 3编译器来编写程序:OnlineGDB

def convert_from_F():
   F = float(input("Please input the temperature in F: "))
   print("Temperature in F is", F)
   print("Temperature in C is", (F-32)*5/9)
   print("Temperature in K is", (F-32)*5/9 + 273.15)

def convert_from_C():
   C = float(input("Please input the temperature in C: "))
   print("Temperature in F is", (C*9/5) + 32)
   print("Temperature in C is", C)
   print("Temperature in K is", C+273.15)

def convert_from_K():
   K = float(input("Please input the temperature in K: "))
   print("Temperature in F is", (K-273.15)*9/5 + 32)
   print("Temperature in C is", K-273.15)
   print("Temperature in K is", K)

def convert_from_inch():
   inch = float(input("Please input the distance in inches: "))
   print("Distance in inches is:", inch)
   print("Distance in feet is:", inch/12)
   print("Distance in yards is:", inch/36)
   print("Distance in miles is:", inch/63360)

def convert_from_ft():
   ft = float(input("Please input the distance in feet: "))
   print("Distance in inches is:", ft*12)
   print("Distance in feet is:", ft)
   print("Distance in yards is:", ft/3)
   print("Distance in miles is:", ft/5280)

def convert_from_yd():
   yd = float(input("Please input the distance in yards: "))
   print("Distance in inches is:", yd*36)
   print("Distance in feet is:", yd*3)
   print("Distance in yards is:", yd)
   print("Distance in miles is:", yd*1760)

def convert_from_mi():
   mi = float(input("Please input the distance in miles: "))
   print("Distance in inches is:", mi*63360)
   print("Distance in feet is:", mi*5280)
   print("Distance in yards is:", mi*1760)
   print("Distance in miles is:", mi)

print("To convert distance input inch, ft, yd, or mi. To convert \ 
temperatures please input F, C, or K. ")
user_input = input("Your input: ")

def user_conversion():
   if user_input == F or f:
       convert_from_F()
   elif user_input == C or c:
       convert_from_C()
   elif user_input == K or k:
       convert_from_K()
   elif user_input == inch:
       convert_from_inch()
   elif user_input == ft:
       convert_from_ft
   elif user_input == yd:
       convert_from_yd()
   elif user_input == mi:
       convert_from_mi()
   else:
       print("Invalid input.")

print(user_conversion())

编辑:我看到这被标记为可能重复。重复的问题对我没有帮助,我不是在试图将其设置为集合,而是在试图弄清楚如何使if语句运行。针对我的问题给出的解决方案与针对其他问题的解决方案不同。但是,我是Python的新手,所以我完全有可能无法建立更有经验的人可以建立的联系。我在这里收到的答案确实帮助了我。

6 个答案:

答案 0 :(得分:2)

您的if构造错误。它必须是if user_input == 'F' or user_input == 'f':

或者,您也可以将其写为

if user_input in ['F', 'f']:

或在注释中指定为

if user_input.lower() == 'f':

答案 1 :(得分:1)

它正在读取F等作为变量名。要解决此问题:

  1. 将它们重写为"F"等。
  2. 修正您的比较; or用于多个比较,不能用于您的使用方式。考虑改用user_input.casefold() == "f"

答案 2 :(得分:0)

您需要引用该值并修复测试,所以

   if user_input == F or f:

成为

   if user_input == "F" or user_input == "f":

与其他行相同

答案 3 :(得分:0)

您必须在or的两边都有条件。所以:

def user_conversion():
   if user_input == 'F' or user_input == 'f':
       convert_from_F()
...

或者您可以只使用

def user_conversion():
   if user_input.lower() == 'f':
       convert_from_F()
...

答案 4 :(得分:0)

您要确保要与字符串进行比较。因此,您的if语句如下所示:

if user_input == "F" or user_input == "f":
    convert_from_F(user_input)

但是,这有点冗长。相反,请尝试:

if user_input.lower() == "f":
    convert_from_F(user_input)

此版本将user_input的值转换为其小写变体,如果已经是小写,则不理会它。您也可以通过保存user_input.upper() == "F"来执行类似的操作。

答案 5 :(得分:0)

可能是更短和更简单的版本

if user_input in ["F","f"]:

其他条件也是如此。

原因是您收到该错误,因为if语句的含义适用于布尔布尔值True或False的用户。

让我们假设'or'的左侧(LHS)和右侧的(RHS)条件为布尔值。

因此,按照您的语法, LHS是user_input == "F",返回True或False。 但是或的RHS是"f"。这就是问题出现的地方。 RHS在符号上不正确。