#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()