1

Probably obvious, but for some reason, this code:

import random
import time
def tables():
    global tablesUsed
    tablesUsed = [int(x) for x in input("Please choose which multiplication tables you wish\nto practice, then type them like this: 2 5 10.\n").split()]
    return tablesUsed
def timer():
    timer  = input("Do you wish to play with the timer? (yes or no)\n")
    if timer == "yes":
        withTimer()
    else:
        withoutTimer()
def withTimer():
    playAgain = "yes"
    total = 0
    correct = 0
    while playAgain == "yes":
        total = total + 1
        random1 = random.choice(tablesUsed)
        random2 = random.randint(1, 12)
        realAnswer = random1 * random2
        start = time.time()
        humanAnswer = int(input("What is the answer to this multiplication sum?\n" + str(random1) + " * " + str(random2) + "\n"))
        if realAnswer == humanAnswer:
            elapsed = round((time.time() - start), 1)
            correct = correct + 1
            score = str(int(correct / total * 100)) + "%"
            if elapsed < 2:
                print("Congratulations, you got it correct in " + str(elapsed) + " seconds!\nThat is a very good time!\nScore: " + score)
            else:
                print("Congratulations, you got it correct in " + str(elapsed) + " seconds!\nNow work on your time.\nScore: " + score)            
        else:
            score = str(int(correct / total * 100)) + "%"
            print("Unforunately, you got this one incorrect, the actual answer was " + str(realAnswer) + ".\nScore: " + score)
        playAgain()
def withoutTimer():
    playAgain = "yes"
    total = 0
    correct = 0
    while playAgain == "yes":
        total = total + 1
        random1 = random.choice(tablesUsed)
        random2 = random.randint(1, 12)
        realAnswer = random1 * random2
        humanAnswer = int(input("What is the answer to this multiplication sum?\n" + str(random1) + " * " + str(random2) + "\n"))
        if realAnswer == humanAnswer:
            correct = correct + 1
            score = str(int(correct / total * 100)) + "%"
            print("Congratulations, you got it correct!\nScore: " + score)         
        else:
            score = str(int(correct / total * 100)) + "%"
            print("Unforunately, you got this one incorrect, the actual answer was " + str(realAnswer) + ".\nScore: " + score)
        playAgain()
def playAgain():
    playAgain = input("Do you wish to play again? (yes or no)\n")
    if playAgain == "yes":
        settings()
    else:
        print("Thank you for practising your multiplication tables with me. Your final score was " + score + " and your average time was " + averageTime)
def settings():
    settings = input("Do you wish to edit settings? (yes or no)\n")
    if settings == "yes":
        tables()
        timer()
tables()
timer()

returns an error saying:

TypeError: 'str' object is not callable, line 66, line 10, line 35

Please could someone help and tell me what I'm doing wrong? I gather that it's probably to do with defining functions incorrectly, but I can't find anything on that solves my problem.

1 Answer 1

6

You defined playAgain both as a function and a local variable in the withTimer function:

def withTimer():
    playAgain = "yes"

    # ...

    while playAgain == "yes":
        # ....

        playAgain()   # this is now a string, not the function

Don't do that, use meaningful names that don't shadow your function names.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.