Python 3: возврат переменной через несколько функций - PullRequest
1 голос
/ 10 апреля 2019

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

Ответы [ 5 ]

1 голос
/ 10 апреля 2019

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

1 голос
/ 10 апреля 2019

При каждом вызове функций 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()

1 голос
/ 10 апреля 2019

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

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

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

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

0 голосов
/ 10 апреля 2019

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

0 голосов
/ 10 апреля 2019

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

  • Вы даете 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()
...