Как исправить ошибку ValueError? - PullRequest
0 голосов
/ 27 января 2020

Я использовал книгу Python для детей, чтобы изучить основы Python 2.7.14, и в ней есть эта Python написанная игра. Это игра с угадыванием чисел, но в строке 40 кода ValueError продолжает появляться. Как это исправить?

Строка 40: if comnum == int(players_guess):

Весь код:

# New constants
QUIT = -1
quit_text = 'q'
quit_message = 'Thanks for playing'
comfirm_quit_message = 'Are you sure you want to quit (Y/N)?'

# New comfirm_quit funtion


def comfirm_quit():
    """Ask user to comfirm that they want to quit
    default to yes
    Return True (yes, quit) or False (no, don't quit) """
    spam = raw_input(comfirm_quit_message)
    if spam == 'n':
        return False
    else:
        return True


def do_guess_round():
    """Choose a random number, ask the user for a guess
    check wether the guess is true
    and repeat until the user is correct"""
    comnum = random.randint(1, 100)
    numofguess = 0
    while True:
        players_guess = raw_input('Input your choice:')
        # new if clause to test against quit
        if players_guess == quit_text:
            if comfirm_quit():
                QUIT
            else:
                continue  # that is, do next round of loop
        numofguess = numofguess + 1
        if comnum == int(players_guess):
            print('Correct!')
        elif comnum > int(players_guess):
            print('Too low')
        else:
            print('Too high')

    totalrounds = 0
    totalguesses = 0

    while True:
        totalrounds = totalrounds + 1
        print('Starting round number: ' + str(total_rounds))
        print('Let the guessing begin!!!')
        thisround = do_guess_round()

        # new if condition (and clode block) to test against quit
        if thisround == 0:
            totalrounds = totalrounds - 1
            avg = str(totalguesses / float(totalrounds))
            if totalrounds == 0:
                statsmsg = 'You completed no rounds. ' +\
                           'Please try again later.'
            else:
                statsmsg = 'You played ' + str(totalrounds) +\
                           ' rounds, with an averave of ' +\
                           str(avg)
            break

            totalguesses = totalguesses + thisround
            avg = str(totalguesses / float(totalrounds))
            print("You took " + str(thisround) + " guesses")
            print("Your guessing average = " + str(avg))
            print("")

        # Added exit messages
        print(statsmsg)

(я изменил имя переменных в коде, поэтому переменные не будут такими же, как в книге.)

Сообщение об ошибке: Traceback (most recent call last): File "C:\Users\26benk\Desktop\Programming\PY 2\Programs\Number_guess_game.py", line 40, in <module> if comnum == int(players_guess): ValueError: invalid literal for int() with base 10: '0.1'

Ответы [ 2 ]

0 голосов
/ 27 января 2020

Это потому, что у вас нет оператора break, чтобы вытащить вас из l oop, где вы проверяете, правильно ли пользователь угадывает число или нет.

В этом l oop,

while True: 
    players_guess = raw_input(prompt)
    # new if clause to test against quit
    if players_guess == quit_text:
        if comfirm_quit():
            QUIT
        else:
            continue # that is, do next round of loop
    numofguess = numofguess+1
    if comnum == int(players_guess):
        print('Correct!')
    elif comnum > int(players_guess):
        print('Too low')
    else:
        print('Too high')

, даже если пользователь правильно угадывает, ему задают raw_input, потому что l oop все еще активен. Если вы нажмете Enter, вы получите ValueError, потому что вы пытаетесь использовать функцию int в пустой строке. Чтобы избежать этого, измените свой l oop на

while True: 
    players_guess = raw_input(prompt)
    # new if clause to test against quit
    if players_guess == quit_text:
        if comfirm_quit():
            QUIT
        else:
            continue # that is, do next round of loop
    numofguess = numofguess+1
    if comnum == int(players_guess):
        print('Correct!')
        break
    elif comnum > int(players_guess):
        print('Too low')
    else:
        print('Too high')

. Есть и другие проблемы с этим кодом. Первое, в то время как l oop должно быть функцией do_guess_round function

0 голосов
/ 27 января 2020

Пожалуйста, удалите преобразование типов в строке, как эта if comnum == int (Players_guess): to if comnum == Players_guess: и добавьте эти строки рядом с необработанным вводом,

players_guess = raw_input(prompt)
try:
    players_guess = int(players_guess)
except ValueError:
    players_guess = str(players_guess)

Это определенно решит дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...