Python. Некорректно работает if, когда добавляю input

Всем привет!

Есть две функции, одна тянет данные из другой.

Логика простая: в первую функцию ввожу данные в input, вторая уточняет, действительно ли я это хотел ввести

 def first_layer(x,y):

    if answer == 1:
        return x
    if answer == 2:
        return y
    else:
        return 'Вводи только 1 или 2'

x = 'Один'
y = 'Два' 

answer = int(input('1 - Один, 2 - Два: '))
result = first_layer(x,y)

print (result)

def second_layer(o,p):


    if first_layer(x,y) == x:
        return o
    if first_layer(x,y) == y:
        return p
    else:
        return 'Дружище, вводи только 1 или 2'
    
o = f'Я правильно понял, что ты выбрал {x}?'
p = f'Я правильно понял, что ты выбрал {y}?'

result = second_layer(o,p)
print (result)

И все работает отлично. В первой функции ввожу 1, мне возвращается, что я выбрал 1. Ввожу 2, возвращается, что выбрал 2

Но только стоит мне во второй функции добавить input

o = int(input(f'Я правильно понял, что ты выбрал {x}?'))
p = int(input(f'Я правильно понял, что ты выбрал {y}?'))

Так if сразу начинает ошибаться и если я в первой функции выбираю "2", во второй функции получаю ответ, предназначенный для "1"

например:

1 - Один, 2 - Два: 2
Два
Я правильно понял, что ты выбрал Один?

Помогите, пожалуйста, разобраться, что делаю не так. Если можно, очень подробно. Опыт в программировании 1 месяц.

Спасибо!


Ответы (1 шт):

Автор решения: Сергей

К работе if это не имеет никакого отношения. Переменная о стоит в основной последовательности, а не во второй функции, как написано автором вопроса, поэтому её строка выполняется сразу после print, нет никакого if.

К "что делаю не так" - не только сама ошибка "не так" - неверен сам стиль написания кода, нельзя так писать, так как очень тяжело читать, а стиль сам потенциально порождает ошибки (что и случилось). Например, вторая функция second_layer почему-то "сидит" посреди основной программы, постоянные параметры х и y зачем-то передаются в первую функцию first_layer (аналогично o и p - во вторую), а единственная изменяющаяся переменная answer просто берется за счет области видимости. Зато вторая фунцкция до х и у добирается тоже через область видимости. И т.д. Крайне рекомендую продумать, что вообще хочется иметь, и структурированно написать всё заново.

Фактически код основной части (в "нерабочем" варианте автора с новыми o и p) сейчас выглядит так:

x = 'Один'
y = 'Два' 
answer = int(input('1 - Один, 2 - Два: '))
result = first_layer(x,y)
print (result)
#следующая строка выведет "1" всегда, так как она стоит к исполнению без всякого условия
o = int(input(f'Я правильно понял, что ты выбрал {x}?'))
p = int(input(f'Я правильно понял, что ты выбрал {y}?'))
result = second_layer(o,p)
print (result)

Вот так можно переписать, чтобы убрать ошибку: (def second_layer перенесён наверх, а в переменной result теперь запоминаем, какие данные бот выдавал ранее, не надо снова вызывать first_layer из second_layer - и надёжнее, и быстрее так)

def first_layer(x,у): #оставил аргументы только с учётом, что х и у   однажды будут в других версиях динамически меняться

    if answer == 1:
        return x
    elif answer == 2: #elif правильнее, чем просто if тут 
        return y
    else:
        return 'Вводи только 1 или 2'

def second_layer(result): #передаём сюда результат первой функции

    if result == x:
        outcome = int(input(f'Я правильно понял, что ты выбрал {x}?'))        
    elif result == y:  #elif правильнее, чем просто if тут
        outcome= int(input(f'Я правильно понял, что ты выбрал {y}?'))
    if outcome!=1 and outcome!=2:
        outcome='Дружище, вводи только 1 или 2'
    return outcome

if __name__=="__main__":

    x = 'Один'
    y = 'Два' 
    answer = int(input('1 - Один, 2 - Два: '))

    result = first_layer(x,y) 
    print (result)

    new_result = second_layer(result)
    print (new_result)
→ Ссылка