我正在阅读“绝对初学者的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
模块。
答案 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):
第二个比第一个缩进得更多。如果第一个是像for
或while
或if
这样的块介绍者,那么这是合法的。既然不是,那就是IndentationError
。而这正是Python告诉你的。
(你可能错误地复制了一些东西。你也可能混合了标签和空格,所以它实际上在你的编辑器中是正确的,但它看起来不错。但如果这些都不是真的,这本书是错的。)
所以,你试图通过dedenting for
循环上的所有内容来修复它。
但是当你这样做时,while
循环下只剩下一行:
while again != "n":
players = []
没有任何东西可以改变again
到"n"
,所以这将永远旋转,什么都不做,而不是转移到程序的其余部分。
所以,您可能想要做的是缩进 num = …
行到与for i…
行相同的级别,所以他们两个(以及所有的东西) after)在while
循环内结束。