Как изменить переменную в функции, чтобы она затем использовалась в основном коде?

#python #function #variables

#python #функция #переменные

Вопрос:

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

 import random
import sys

print("Welcome to this Maths quiz.")
playerName = str(input("Please enter your name: "))
playerAge = int(input("Please enter your age: "))
if playerAge < 11:
    print("This quiz is not for your age.")
    sys.exit(0)
else :
    print("Great! Let's begin.n")

quizQuestions = ["9(3 8)", "7 9*8", "(9 13)(9-5)", "50*25%", "104-4 5*20"]
quizAnswers = ["99", "79", "88", "12.5", "0"]
quizSync = list(zip(quizQuestions, quizAnswers))
random.shuffle(quizSync)
quizQuestions, quizAnswers = zip( * quizSync)
questionNumber = 1
quizScore = 0

def displayQuestion(quizQuestions, quizAnswers, questionNumber, quizScore):
    print("Question "   str(questionNumber)   ": "   quizQuestions[questionNumber - 1]   "n")
    questionAnswer = str(input())
    if questionAnswer == quizAnswers[questionNumber - 1]:
        print("nCorrect!n")
        quizScore  = 1
    else :
        print("nIncorrect! The answer is: "   quizAnswers[questionNumber - 1]   "n")

while questionNumber < 6:
    displayQuestion(quizQuestions, quizAnswers, questionNumber, quizScore)
    questionNumber  = 1

print("You have a total score of: " str(quizScore))
  

Я бы хотел, чтобы переменная «quizZcore» в функции «displayQuestion» увеличивалась на единицу, если игрок правильно задает вопрос. Однако после завершения теста функция печати в конце всегда выводит значение 0, даже если игрок правильно задает вопросы.

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

1. У вас печатается «Правильно!»?

2. Да, я получаю «Правильно!» и «Неправильно», напечатанные с соответствующим ответом.

3. Во-первых, displayQuestion не возвращает строку, так почему вы ее печатаете print(displayQuestion(quizQuestions, quizAnswers, questionNumber, quizScore)) ?

4. глобальный контрольный балл в вашей функции.

Ответ №1:

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

 def displayQuestion(quizQuestions, quizAnswers, questionNumber):
    global quizScore    
    ...
    quizScore  = 1
  

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

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

1. Вы имеете в виду что-то вроде этого: pastebin.com/Dd0BiFag

2. Вы не можете одновременно передавать quizScore ее в качестве аргумента и использовать как глобальную переменную. Либо вы передаете ее в качестве аргумента, а затем возвращаете как возвращаемую переменную, либо делаете ее глобальной переменной и изменяете ее на месте

Ответ №2:

Хотя это не самый короткий ответ, который заключается в использовании другой глобальной переменной. Вместо этого он покажет вам, как избежать использования глобальных переменных (которые считаются вредными) с помощью объектно-ориентированного программирования (ООП). Для достижения этой цели большая часть кода в вашем вопросе может быть инкапсулирована в один класс, указанный MathQuiz ниже.

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

 import random
import sys

class MathQuiz:
    def __init__(self, questions, answers):
        quizSync = list(zip(questions, answers))
        random.shuffle(quizSync)
        self.quizQuestions, self.quizAnswers = zip(*quizSync)
        self.quizScore = 0

        print("Welcome to this Maths quiz.")
        self.playerName = str(input("Please enter your name: "))
        self.playerAge = int(input("Please enter your age: "))
        if self.playerAge > 10:
            print("Great! Let's begin.n")
        else :
            print("This quiz is not for your age.")
            sys.exit(0)

    def run(self):
        for questionNumber in range(len(self.quizQuestions)):
            self._displayQuestion(questionNumber)

        print("You have a total score of: "   str(self.quizScore))

    def _displayQuestion(self, questionNumber):
        print("Question "   str(questionNumber)   ": "
                self.quizQuestions[questionNumber-1]
                "n")
        questionAnswer = str(input())
        if questionAnswer == self.quizAnswers[questionNumber-1]:
            print("nCorrect!n")
            self.quizScore  = 1
        else :
            print("nIncorrect! The answer is: "
                    self.quizAnswers[questionNumber-1]
                    "n")

quiz = MathQuiz(["9(3 8)", "7 9*8", "(9 13)(9-5)", "50*25%", "104-4 5*20"],
                ["99", "79", "88", "12.5", "0"])
quiz.run()