为什么else语句总是运行

时间:2018-12-12 18:38:56

标签: python scope

我试图将华氏温度转换为摄氏温度,反之亦然,但是我总是在运行后以else语句结束。瑞典语也很抱歉。

我不知道为什么它总是运行else语句。

代码:

def meny():
    print ("""            Programs menu:
           1. Convert from Fahrenheit to Celsius
           2. Convert from Celsius to Fahrenheit
           3. Exit the program
         """)
def val():

    val = int(input("Enter your choice (1, 2 or 3):") )

    return val

meny()
val()

if  val == 1:

    # Convert from Fahrenheit to Celsius

elif val == 2:

    # Convert from Celsius to Fahrenheit

elif val == 3:

    # Exit the program

else:

    print("Invalid choice. Try again")

2 个答案:

答案 0 :(得分:1)

这里的根本问题是名称val用于不同的事物。

首先,您有一个名为val函数

def val():

在函数之外,名称val始终引用此函数对象。函数对象不等于任何整数,因此与任何整数的任何比较都将始终返回False

在函数内部,创建一个新的 local 名称val

val = int(input("Ange ditt val (1, 2 eller 3): ") )

此名称是该函数的 local ,并且在函数结束后将消失。我们说它有本地 scope 。实际上,每个赋值语句(每个使用=赋值运算符的语句)将始终分配给 current 范围内的名称,而不是外部范围,除非使用nonlocal或使用了global个关键字。

您可以使用val声明从功能val中重新分配全局名称global val,但是如果这样做,那么您不能再使用名称val来引用该函数。同样,您可以从函数外部重新分配全局名称val

val = val()

但是同样,这只能一次完成,因为之后的val将不再引用函数对象。 (而且,这会使程序难以阅读和理解。)

最好的办法是为这两种不同的东西使用两个不同的名称。

通常最好的做法是使用动词或动词短语来命名函数,例如:

def get_value():

然后您可以使用名词或名词短语作为返回值:

value = get_value()
if value == 1:
    ...

答案 1 :(得分:0)

您将相同的标识符用于不同的事物。尽管有时可以做到这一点,但可能会非常令人困惑。

此外,函数名称应描述该函数的功能。例如,代替

def val():
    val = int(input("Ange ditt val (1, 2 eller 3): ") )
    return val

你应该做

def get_value():
    val = int(input("Ange ditt val (1, 2 eller 3): ") )
    return val

(或者也许是get_choice()get_val())。

并且,当您调用函数时,应将其返回值放入某个变量中。就您而言,应该是

val = get_choice() # or how you named the function

这样,该函数的名称不会被覆盖,从而使该函数随后无法调用。