Python 3: возврат переменной через несколько функций

#python #function #loops #return

#python #функция #циклы #Возврат

Вопрос:

Мне была задана базовая проблема python, которая требует, чтобы я сделал простой тест на добавление. Однако, похоже, я не могу вернуть свою переменную count, которая должна обновлять количество правильных вопросов, на которые ответил пользователь, из-за чего он застрял на 0. Я попытался определить количество переменных в каждой функции, содержащей ее в качестве аргумента, но все равно не работает. Скажем, если пользователь должен был ответить на 4 вопроса и получил 3 правильных, он отобразил бы его как «Вы ответили на 4 вопроса с 3 правильными», но вместо этого он отображает «Вы ответили на 4 вопроса с 0 правильными».

Комментарии:

1. во всех функциях, которые используют count, вы устанавливаете count=0 , даже если функция уже принимает его в качестве параметра. Я думаю, что вы перезаписываете count , заставляя ее сбрасываться на 0 для каждой создаваемой новой арифметической задачи?

Ответ №1:

Каждый раз check_solution , когда вызываются ваши menu_option функции и , вы инициализируете count = 0 . Это означает, что каждый раз, когда пользователь запрашивает другой вопрос, count дважды сбрасывается значение 0. Вы захотите удалить эти count = 0 вызовы, а также хотите записывать свои обновления для подсчета menu_option . Ваша окончательная программа должна выглядеть примерно так:

 import random

def get_user_input():
    count = 0
    user_input = int(input("Enter 1 to play or press 5 to exit: "))
    while user_input > 5 or user_input <= 0:
        user_input = int(input("Invalid menu option. Try again: "))
        menu_option(user_input, count)

        if user_input == "5":
            print("Exit!")

    return user_input

def get_user_solution(problem):
    answer = int(input(problem))
    return answer

def check_solution(user_solution, solution, count):
    curr_count = count
    if user_solution == solution:
        curr_count  = 1
        print("Correct.")

    else:
        print("Incorrect.")
    print(curr_count)
    return curr_count

def menu_option(index, count):
    if index == 1:
        num1 = random.randrange(1, 21)
        num2 = random.randrange(1, 21)
        randsum = num1   num2
        problem = str(num1)   " "   " "   " "   str(num2)   " "   "="   " "
        user_answer = get_user_solution(problem)
        count = check_solution(user_answer, randsum, count) # count returned by check_solution is now being captured by count, which will update your count variable to the correct value

    return count

def display_result(total, correct):
    if total == 0:
        print("You answered 0 questions with 0 correct.")
        print("Your score is 0%. Thank you.")
    else:
        score = round((correct / total) * 100, 2)
        print("You answered", total, "questions with", correct, "correct.")
        print("Your score is", str(score)   "%.")

def main():
    option = get_user_input()
    total = 0
    correct = 0
    while option != 5:
        total = total   1
        correct = menu_option(option, correct)
        option = get_user_input()

    print("Exiting.")
    display_result(total, correct)

main()

  

Ответ №2:

Вам нужно перехватить возврат из check_solution(user_answer, randsum, count) и вернуть это количество

Ответ №3:

Как указано в комментарии, вы инициализируете значение count равным 0 каждый раз, когда вызывается ваш check_solution или menu_option.

Похоже, вы хотите использовать count = count переменную, передаваемую вашей функции.

Просто быстрое редактирование:

На самом деле вам не нужно возвращать count. В Python переменные передаются по ссылке, поэтому ваш счетчик будет обновляться до тех пор, пока он передается вашим функциям.

Ответ №4:

У вас есть возможность инициализировать значение count равным 0 перед всеми функциями, создавая таким образом глобальную переменную. Тогда вам не нужно будет объявлять ее в какой-либо функции или передавать ее в качестве аргумента.

Ответ №5:

Это кульминация нескольких ошибок в логике.

  • Вы передаете count функции в качестве входных данных и немедленно перезаписываете их.

    • Я бы вместо этого сказал def menu_option(index, count=0): . Это значение будет установлено count=0 , если переменная не указана (создание значения по умолчанию), в противном случае оно будет установлено count как все, что вы передаете в функцию
  • Ваша check_solution() функция возвращает число, но когда вы вызываете его с check_solution(user_answer, randsum, count) помощью, вы никогда не присваиваете это возвращаемое значение чему-либо / используете его снова.

    • Вы можете присвоить это переменной (скажем output ), а затем return output вместо return count

Исправление этого все еще не полностью решает проблему, но становится немного ближе (теперь он застревает на «вы ответили на x вопросов с 1 правильным»):

 import random

def get_user_input(count = 0):
    user_input = int(input("Enter 1 to play or press 5 to exit: "))
    while user_input > 5 or user_input <= 0:
        user_input = int(input("Invalid menu option. Try again: "))
        menu_option(user_input, count)

        if user_input == "5":
            print("Exit!")

    return user_input

def get_user_solution(problem):
    answer = int(input(problem))
    return answer

def check_solution(user_solution, solution, count):
    count = 0
    if user_solution == solution:
        count  = 1
        print("Correct.")

    else:
        print("Incorrect.")

    return count

def menu_option(index, count=0):
    if index == 1:
        num1 = random.randrange(1, 21)
        num2 = random.randrange(1, 21)
        randsum = num1   num2
        problem = str(num1)   " "   " "   " "   str(num2)   " "   "="   " "
        user_answer = get_user_solution(problem)
        output = check_solution(user_answer, randsum, count)
    return output

def display_result(total, correct):
    if total == 0:
        print("You answered 0 questions with 0 correct.")
        print("Your score is 0%. Thank you.")
    else:
        score = round((correct / total) * 100, 2)
        print("You answered", total, "questions with", correct, "correct.")
        print("Your score is", str(score)   "%.")

def main():
    option = get_user_input()
    total = 0
    correct = 0
    while option != 5:
        total  = 1
        correct = menu_option(option, correct)
        option = get_user_input()

    print("Exiting.")
    display_result(total, correct)

main()
  

Я думаю, что более упрощенный подход будет выглядеть примерно так:

 import random

def generate_question():
    num1 = random.randint(1, 25)
    num2 = random.randint(1, 25)
    question = '{}   {} = '.format(num1, num2)
    answer = num1   num2
    return question, answer

def main():
    correct = 0
    total = 0
    option = True
    while option != '5':
        total  = 1
        question, answer = generate_question()
        user_guess = int(input(question))
        if user_guess == answer:
            print('Correct.')
            correct  = 1
        else:
            print('Incorrect.')
        option = input("Enter 5 to exit, or anything else to play again")
    print('You answered {} questions with {} correct'.format(total, correct))

main()