簡體   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