builtins.NameError: имя 'угадай' не определено - PullRequest
1 голос
/ 01 октября 2019

Я работал над лабораторным заданием и несколько дней боролся с ошибкой. Я также закодировал return в своей функции, и он постоянно говорит, что есть NameError:, и я не определил его.

Вот код, над которым я работаю, и он все испортил, так как я еще не закончил,Но я хотел бы знать, что я испортил и как я могу исправить ошибку имени. Спасибо!

import random

def main():
    instructions = display_instructions("instructions.txt")


    #display instructions
    display_instructions(instructions)


    list_of_words = ['apple', 'banana', 'watermelon', 'kiwi', 'pineapple', 
                 'mango']

    correct_word=random.choice(list_of_words)
    answer = list(correct_word)

    puzzle = []
    puzzle.extend(answer)

    display_puzzle_string(puzzle)

    play_game(puzzle, answer)

    display_result(is_win, answer)


    input('Press enter to end the game.')

def display_instructions(filename):
    instruction_file=open("instructions.txt","r")
    file_contents=instruction_file.read()
    instruction_file.close()
    print(file_contents)


def display_puzzle_string(puzzle):
    for i in range(len(puzzle)):
        puzzle[i] = '_'
    print('The answer so far is '+" ".join(puzzle))


def play_game(puzzle, answer):
    num_guesses = 4    
    while num_guesses > 0:
        get_guess(num_guesses)
        update_puzzle_string(puzzle, answer, guess)
        display_puzzle_string(puzzle)
    is_word_found(puzzle)


def get_guess(num_guesses):
    guess=input('Guess a letter '+'('+str(num_guesses)+' guesses remaining):')
    return guess


def update_puzzle_string(puzzle, answer, guess):
    for i in range(len(answer)):
                if guess.lower() == answer[i]:
                    puzzle[i] = guess.lower()
                    num_guesses += 1    
    return puzzle


 def is_word_found(puzzle):
    if puzzle == answer:
        return is_win


def display_result(is_win, answer):
    if is_win:
        print('Good job! You found the word '+correct_word+'!')

    else: 
        print('Not quite, the correct word was '+correct_word+
          '. Better luck next time')

main()

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

В функции play_game имеется строка get_guess(num_guesses), которая возвращает переменную предположения. Однако вы не назначаете предположение переменной в функции. Вы можете исправить это, изменив эту строку на guess = get_guess(num_guesses). Ошибка говорит вам, что именно не так. Вы еще не определили переменную guess.

0 голосов
/ 01 октября 2019

Ваш код имеет разные недостатки. Основные ошибки связаны с отступами и областями действия. Имейте в виду, что Python использует отступы для группировки операторов. Используйте последовательно 4 пробела в качестве отступа для операторов группировки, например, для отступа тела функции, тела цикла for и т. Д.

Кроме того, в вашем коде много ошибок undefined name, так как вы ссылаетесь на имена, которые не являютсяопределено в текущей области. Рассмотрим вашу функцию is_word_function(puzzle):

def is_word_found(puzzle):
    if puzzle == answer:
        return is_win

Имя answer определено в main(), тогда как is_win вообще не определено (вы передаете его в display_result() в main(), но не определили это раньше). Лучшее объявление функции выглядело бы так:

def is_word_found(puzzle, answer):
    return puzzle == answer

Обратите внимание, что это предложение предназначено для образования, я не думаю, что вам обязательно нужна функция для этого.

Как правило, для того, чтобычтобы имена были доступны в текущей (функциональной) области, вы должны либо передать аргументы в функцию, либо поместить их на уровне модуля, либо - что еще лучше - рассмотреть вопрос об ООП (что, поскольку это лабораторное задание, япредположим, что вы еще этого не сделали).

Как только вы исправите эти ошибки и ваш код скомпилируется, вам нужно поработать над логикой своей игры. Например, в play_game у вас есть цикл while num_guesses > 0, который будет работать бесконечно, так как вы никогда не уменьшаете счетчик num_guesses (фактически вы увеличиваете его в update_puzzle_string. Лучший цикл будет выглядеть так:

def play_game(puzzle, answer, ..):
    num_guesses = 4
    while num_guesses and not is_word_found(puzzle, answer):
        # logic
        num_guesses -= 1

# or, alternatively
def play_game(puzzle, answer, ..):
    num_guesses = 4
    for _ in range(num_guesses):
        # logic
        if is_word_found(puzzle, answer):
            # break or return

Рекомендуется использовать flake8 для проверки вашего кода, выявления ошибок и непитоновых конструкций кода в будущем.

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