TypeError: unsupported operand type(s) for -: 'int' and 'NoneType'

TypeError: unsupported operand type(s) for -: 'int' and 'NoneType'

我在将值输入函数时遇到问题,并且该值类型不是 int,而是 NoneType,我无法对其进行操作。这是我抛出的错误消息:

Traceback (most recent call last):
  File "NumberGame1.py", line 140, in <module>
    main()
  File "NumberGame1.py", line 29, in main
    result = guessinggame(number)
  File "NumberGame1.py", line 92, in guessinggame
    if guess - number <= level * 0.1:
TypeError: unsupported operand type(s) for -: 'int' and 'NoneType'

所有代码如下:

import random

import timeit

def main():

    print "\nWelcome to Ethan's Number Guessing Game!"

    print "What would you like to do?: \n1. Play game\n2. View High Scores\n3. View Credits"
    menuchoice = input()
    ## choice is Menu Decision
    if menuchoice == 1:
        difficulty = input("Pick a difficulty!: \n1: Easy\n2: Medium\n3: Hard\n4: Insane\n5. Out of control!\n6. Custom\n")         
        leveldif = difcalc(difficulty)         
        ## Exits program if you don't choose a difficulty

        global level

        level = leveldif[0]

        difmod = leveldif[1]

        number = numbergenerator(level)

        result = guessinggame(number)

        totalTime = result[0]

        tries = result[1]

        scorer(tries, totalTime)


    elif menuchoice == 2:
        ## Figure out how to access high scores
        print "This feature is currently under development.\n"
    elif menuchoice == 3:
        print "\nDeveloped by Ethan Houston"
        raw_input()
        print "\nDeveloped in Python 2.7.9 using Sublime Text 2"
        raw_input()
        print "\nThanks for playing :)"
        raw_input()
        ## Simple credits reel. Go me


def difcalc(difficulty):
    if difficulty == 1:
        leveldif = [10, 1]

    elif difficulty == 2:
        leveldif = [50, 1.5]


    elif difficulty == 3:
        leveldif = [100, 2]

    elif difficulty == 4:
        leveldif = [1000, 10]


    elif difficulty == 5:
        leveldif = [10000, 20]

    elif difficulty == 0:
        leveldif = [1, 1]

    return leveldif

def guessinggame(number):
    tries = 1
    ## Counter for number of attempts at guessing

    guess = input("Guess a number between 1 and " + str(level) + "!: ")
    ## Takes input from user

    while guess > level:
       guess = input("Above range!\nMake sure to guess between 1 and " + str(level) + "!: ")
        ## If the user chooses a number above the range, makes you try again until within range

    startTime = timeit.default_timer()
    ## Starts a timer once first valid number is selected

    while guess != number:
    ## While loop that runs as long as guess isn't correct
        if guess > number:
            if guess - number <= level * 0.1:
                guess = input("Too high, close!: ")
                tries += 1
                ## If difference between guess and answer is less than or equal to 10% of level,
                ## prints different prompt
            else:
                guess = input("Too high, guess again: ")
                tries += 1
                ## Normal behavior

        elif guess < number:
            if guess - number <= level * 0.1:
                guess = input("Too low, close!: ")
                tries += 1
                ## If difference between guess and answer is less than or equal to 10% of level,
                ## prints different prompt
            else:
                guess = input("Too low, guess again: ")
                tries += 1
                ## Normal behavior

    endTime = timeit.default_timer()
    ## Takes the time after the correct number is chosen

    totalTime = endTime - startTime
    ## Calculates time difference between start and finish

    result = [totalTime, tries]

    return result

def numbergenerator(level):
    global number
    number = random.randint(1, level)

def scorer(tries, totalTime):
    print "\nCorrect! It took you " + str(round(totalTime, 2)) + " seconds and "  \
                + str(tries) + " tries to guess.\n"
    ## Once user guesses correct number, program tells how many tries it took, and how long

    score = 1/(1+(tries * round(totalTime, 2))) * 1000 * difmod
    ## Calcualtes score, making lower times and fewer tries yield a higher score
    ## Difmod takes into account the difficulty
    ## Multiply by 1000 to make number more readable

    print "Score: " + str(round(score, 2)) + "\n"
    ## Printsthe score, rounded to 1 decimal place

main()

当一个 python 函数没有明确地 return 任何东西时,它 returns None。在你的例子中,你有一个函数 -

def numbergenerator(level):
    global number
    number = random.randint(1, level)

这不会 return 任何东西,而是您设置了一个全局变量 number

但是当你在 main() 中调用这个函数时,你会 -

number = numbergenerator(level)

这里 number 不是全局变量(即使它是全局变量也没关系),所以在调用 numbergenerator() 之后,因为它没有 return 任何东西,它 returns None ,它被设置为 number 变量,因此 number 是 None,导致您遇到的问题。

我相信你不需要在那里使用 global variable,你应该只 return 来自 numbergenerator() 函数的数字,例如 -

def numbergenerator(level):
    return random.randint(1, level)