繁体   English   中英

TypeError:-:“ int”和“ 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函数未明确返回任何内容时,它将返回None 就您而言,您有一个功能-

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

这不会返回任何内容,而是设置一个全局变量number

但是,当您在main()中调用此函数时,您会-

number = numbergenerator(level)

而且这里的number不是全局变量(即使它是全局变量也没关系),因此在调用numbergenerator() ,由于它不返回任何内容,因此它返回None ,它被设置为number变量,因此为number为无,则导致您遇到问题。

我相信您不需要在那里使用global variable ,只需从numbergenerator()函数返回数字,例如-

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM