2013-08-05 3 views
2

Я читаю книгу «Python Programming for Absolute Beginner (3-е издание)». Я вхожу в главу, в которой представлены пользовательские модули, и я считаю, что это может быть ошибкой в ​​кодировании в книге, потому что я проверил ее 5 или 6 раз и точно соответствовал ей.Пользовательские модули Python - ошибка с примером кода

Во-первых у нас есть собственный модуль games.py

class Player(object): 
    """ A player for a game. """ 
    def __init__(self, name, score = 0): 
     self.name = name 
     self.score = score 

    def __str__(self): 
     rep = self.name + ":\t" + str(self.score) 
     return rep 

def ask_yes_no(question): 
    """ Ask a yes or no question. """ 
    response = None 
    while response not in ("y", "n"): 
     response = input(question).lower() 
    return response 

def ask_number(question, low, high): 
    """ Ask for a number within a range """ 
    response = None 
    while response not in range (low, high): 
     response = int(input(question)) 
    return response 

if __name__ == "__main__": 
    print("You ran this module directly (and did not 'import' it).") 
    input("\n\nPress the enter key to exit.") 

и теперь SimpleGame.py

import games, random 


print("Welcome to the world's simplest game!\n") 

again = None 
while again != "n": 
    players = [] 

num = games.ask_number(question = "How many players? (2 - 5): ", low = 2, high = 5) 
    for i in range(num): 
     name = input("Player name: ") 
     score = random.randrange(100) + 1 
     player = games.Player(name, score) 
     players.append(player) 

    print("\nHere are the game results:") 
    for player in players: 
     print(player) 

    again = games.ask_yes_no("\nDo you want to play again? (y/n): ") 

input("\n\nPress the enter key to exit.") 

Так что это именно то, как выглядит код в книге. Когда я запускаю программу, я получаю ошибку IndentationError по адресу for i in range(num):. Я ожидал, что это произойдет, поэтому я изменил его и удалил 1 вкладку или 4 пробела перед каждой строкой от for i in range(num) до again = games.ask_yes_no("\nDo you want to play again? (y/n): ").

После этого выход "Welcome to the world's simplest game!" и все.

Мне было интересно, может ли кто-нибудь сообщить мне, почему это происходит?

Кроме того, модуль import games, распознается в Eclipse после того, как я добавил путь к PYTHONPATH.

+0

ваш отступ выглядит неправильно ... я думаю 'num = ...' требуется больше отступа –

ответ

2

У меня действительно есть эта книга. И да, это опечатка. Вот как это исправить:

# SimpleGame.py 
import games, random 


print("Welcome to the world's simplest game!\n") 

again = None 
while again != "n": 
    players = [] 

    num = games.ask_number(question = "How many players? (2 - 5): ", low = 2, high = 5) 
    for i in range(num): 
     name = input("Player name: ") 
     score = random.randrange(100) + 1 
     player = games.Player(name, score) 
     players.append(player) 

    print("\nHere are the game results:") 
    for player in players: 
     print(player) 

    again = games.ask_yes_no("\nDo you want to play again? (y/n): ") 

input("\n\nPress the enter key to exit.") 

Все, что я сделал отступы num 4 пространства и выстроились его с первой для петли.

+0

О, спасибо! Я должен был это сделать, но я повел себя безумным, пересматривая код. – mccdlibby

1

У вас есть бесконечный цикл здесь:

again = None 
while again != "n": 
    players = [] 
1

Если это именно так, как это напечатано в книге, в книге действительно есть ошибка.

У вас есть эти две строки:

num = games.ask_number(question = "How many players? (2 - 5): ", low = 2, high = 5) 
    for i in range(num): 

Второй более отступом, чем первый. Это только законно, если первый из них представляет собой блок-интродуктор, такой как for или while или if. Поскольку это не так, это IndentationError. И это именно то, что говорит вам Питон.

(Возможно, что вы скопировали ошибки неправильно. Также возможно, что вы смешиваете вкладки и пробелы, поэтому он действительно выглядит правильно в вашем редакторе, но он выглядит неправильно для Python. Но если ни одно из них не верно , книга неверна.)

Итак, вы попытались исправить это, разделив все, начиная с этого цикла for.

Но когда вы сделаете это, только одна линия еще остается под while цикла:

while again != "n": 
    players = [] 

Там нет ничего, что может возможно изменить again к "n", так что это будет только спина навсегда, ничего не делать, а не переходя к остальной части программы.

Итак, что вы, вероятно, хотите сделать, это отступаnum = … линии на тот же уровень, что и for i… линии, так как из них (и всех вещей после) заканчивается внутри цикла while.

+0

Спасибо. Я понимаю, что легко пропустить даже самые простые ошибки. – mccdlibby

+0

@mccdlibby: факт, что есть два разных способа его фиксации: оба они компилируются, но одно правильно, а другое просто приводит к бесполезному бесконечному циклу - именно поэтому Python не может исправить это для вас, и выдает сообщение об ошибке для отладки. – abarnert

Смежные вопросы