Python自定义模块 - 示例代码出错

时间:2013-08-05 23:56:21

标签: python python-3.x module

我正在阅读“绝对初学者的Python编程(第3版)”一书。我在介绍自定义模块的章节中,我相信这可能是书中编码的错误,因为我已经检查了5到6次并完全匹配。

首先我们有一个自定义模块 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):。我预计会发生这种情况所以我更改了它并删除了从for i in range(num)again = games.ask_yes_no("\nDo you want to play again? (y/n): ")每行前面的1个标签或4个空格。

此后输出为"Welcome to the world's simplest game!",就是这样。

我想知道是否有人可以让我知道为什么会这样?

此外,在我添加PYTHONPATH的路径后,在Eclipse中识别import games模块。

3 个答案:

答案 0 :(得分: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个空格,并用第一个for循环排成一行。

答案 1 :(得分:1)

这里有一个无限循环:

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

答案 2 :(得分:1)

如果这与书中的印刷方式完全一致,那么这本书确实有错误。

你有这两行:

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

第二个比第一个缩进得更多。如果第一个是像forwhileif这样的块介绍者,那么这是合法的。既然不是,那就是IndentationError。而这正是Python告诉你的。

(你可能错误地复制了一些东西。你也可能混合了标签和空格,所以它实际上在你的编辑器中是正确的,但它看起来不错。但如果这些都不是真的,这本书是错的。)

所以,你试图通过dedenting for循环上的所有内容来修复它。

但是当你这样做时,while循环下只剩下一行:

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

没有任何东西可以改变again"n",所以这将永远旋转,什么都不做,而不是转移到程序的其余部分。

所以,您可能想要做的是缩进 num = …行到与for i…行相同的级别,所以他们两个(以及所有的东西) after)在while循环内结束。