0

在迈克尔·道森(Michael Dawson)的“绝对初学者的 Python”一书中,在关于列表和字典的章节中,我学到了很多东西,并且正在尝试使用旧的 Magic 8-Ball 作为我的灵感来制作一个新程序作为练习。以下是我到目前为止提出的代码。

它可以工作到一定程度...生成随机生成的数字,但 elif 似乎不起作用。我知道有更好和更简单的方法,但我这样做是为了加强我对字典的理解。

我已经放入了几个打印语句,看看我是否选择了一个数字,而 else 语句是如果一切都变坏了。正如代码所示,我得到的只是打印的数字,否则会产生“不计算。退出工作正常。我还使用注释掉的打印“球”语句确认字典很好。

所以我的问题是为什么 elif 语句似乎没有处理生成的随机数。谁回答了我由衷的感谢和赞赏。

# Import the modules
import sys
import random

 # define magic 8-ball dictionary
ball = {"1" : "It is certain.",
        "2" : "Outlook is good.",
        "3" : "You may rely on it.",
        "4" : "Ask again later.",
        "5" : "Concentrate and ask again.",
        "6" : "Reply is hazy, try again later.",
        "7" : "My reply is no.",
        "8" : "My sources say no"}
# for items in ball.items():
#              print(items)

ans = True

while ans:
    question = input("Ask the Magic 8 Ball a question: (press enter to quit) ")

    answer = random.randint(1,8) 
    print(answer)

    if question == "":
        sys.exit()

    elif answer in ball:
        response = ball[answer]
        print(answer, response)
    else:
        print("\nSorry", answer, "does not compute.\n")    
4

3 回答 3

3

random.randint()返回一个整数。你的字典的键都是字符串。因此,当您这样做时answer in ball,它将永远False,因为"1" != 1

您可以做的是将所有键设置为整数(删除引号),或者answer通过以下操作创建一个字符串:

answer = str(random.randint(1,8))

请注意,您不应该在elif此处使用 an 。如果您的输入什么都不是,那么您的ifelif将是 True,并且大多数时候您不希望这样。相反,将您的更改elif/elseif/else

if question == "":
    sys.exit()

if answer in ball:
    response = ball[answer]
    print(answer, response)
else:
    print("\nSorry", answer, "does not compute.\n")    

最后一件事。answer将始终在 中ball,因为您动态创建了字典。在这里,您可以使用dict.get(). 例如:

if not question: # You can do this instead
    sys.exit()

print(ball.get(answer))
于 2013-09-21T09:59:21.413 回答
1

字符串"1"不是 int 1。所以answer其实不在ball。尝试将其转换为answer = str(random.randint(1,8))

于 2013-09-21T09:57:10.273 回答
1

您正在查找带有数字的字典,而键是字典中的字符串。因此,您必须使用 将数字转换为字符串str

改变

answer = random.randint(1,8)

answer = str(random.randint(1,8))
于 2013-09-21T09:58:26.160 回答