定义函数,TypeError

时间:2013-02-23 14:59:24

标签: python python-3.x typeerror

可能很明显,但出于某种原因,这段代码:

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

返回错误说:

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

请有人帮忙告诉我,我做错了什么? 我认为这可能与错误地定义函数有关,但我无法找到解决我问题的任何内容。

1 个答案:

答案 0 :(得分:6)

您在playAgain函数中将withTimer定义为函数和局部变量:

def withTimer():
    playAgain = "yes"

    # ...

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

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

不要这样做,使用不影响函数名称的有意义的名称。