почему всегда выполняется оператор else - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь сделать конвертер из Фаренгейта в Цельсий и наоборот, но я всегда получаю инструкцию 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 голосов
/ 12 декабря 2018

Основная проблема здесь в том, что имя val используется для разных целей.

Сначала у вас есть функция с именем val:

def val():

За пределами функции имя val всегда ссылается на этот функциональный объект .Объект функции не равен ни одному целому числу, поэтому любое сравнение с любым целым числом всегда будет возвращать False.

Внутри функции вы создаете новое локальное имя val:

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

Это имя local для функции и исчезнет, ​​когда функция завершится.Мы говорим, что он имеет локальную область действия .Фактически, каждый оператор присваивания (каждый оператор, использующий оператор присваивания =) всегда будет присваивать имя в текущей области видимости, а не во внешней области, если только ключевые слова nonlocal или global не являютсяused.

Вы могли бы переназначить глобальное имя val из функции val с помощью объявления global val - но если вы сделали это, то вы не могли быбольше не используйте имя val для ссылки на функцию.Точно так же вы можете переназначить глобальное имя val вне функции:

val = val()

Но, опять же, это можно сделать только один раз , поскольку впоследствии val не будетбольше относится к функции объекта.(Кроме того, это может затруднить чтение и понимание программы.)

Вероятно, лучше всего использовать два разных имени для этих двух разных вещей.

Как правило, это лучшая практиканазвать функцию с помощью глагола или фразы глагола, например:

def get_value():

И затем вы можете использовать существительное или словосочетание для возвращаемого значения:

value = get_value()
if value == 1:
    ...
0 голосов
/ 12 декабря 2018

Вы используете один и тот же идентификатор для разных вещей.Хотя иногда это можно сделать, это может быть очень запутанным.

Кроме того, имя функции должно описывать, что делает функция.Например, вместо

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

Таким образом, имя функции не перезаписывается, что делает функцию впоследствии не вызываемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...