嵌套循环'If''语句不会打印元组的值

时间:2014-10-07 19:21:54

标签: python list loops tuples user-input

目前的任务是建立一个基本的文本冒险。我遇到以下代码的问题。当前赋值仅使用函数,这就是赋值规则必须完成的方式。

def make_selections(response):
    repeat = True
    while repeat == True:
        selection = raw_input('-> ')
        for i, v in enumerate(response):
            i +=1 # adds 1 to the index to make list indices correlate to a regular 1,2,3 style list
            if selection == i:
                print v[1]
            else:
                print "There's an error man, what are you doing?!?!?"

firstResponse = 'You chose option one.'
secondResponse = 'You chose option two.'
thirdResponse = 'You chose option three.'

responses = [(0, firstResponse), (1, secondResponse),( 0, thirdResponse)]

make_selections(responses)

我在该代码中的意图是,如果用户选择1,它将返回firstResponse,如果用户选择2,它将返回secondResponse等等。

我基本上只是对代码进行错误测试,以确保它产生适当的响应,因此"Error man..."字符串,但由于某种原因,它只是循环错误消息而不打印相应的响应字符串。这是为什么?

我知道这段代码正在枚举元组列表,我可以正确调用它们,因为我可以将代码更改为以下内容并获得预期的输出:

for i, v in enumerate(response):
    i += 1 # adds 1 to the index to make list indices correlate to a regular 1,2,3 style list
    print i, v

此外,在任何人问之前有两个快速的旁边:

  • 我知道目前没有办法摆脱这个while循环。在进入下一部分之前,我只是确保我的代码的每个部分都有效。这让我想到了元组。
  • 当我得到代码工作时,0将产生响应消息并再次循环,要求用户做出不同的选择,而1将产生适当的响应,突破循环,然后继续故事中的下一个“房间”......这样我就可以根据自己的需要拥有尽可能多的“房间”,玩家每次做出不正确的选择时都不会“死”,而且每个' room'可以有任意数量的选项和可供选择的响应,我不需要为每个房间继续写单独的循环。

3 个答案:

答案 0 :(得分:1)

这里有一些问题。

首先,没有充分理由迭代所有数字只是为了看其中一个是否匹配selection;您已经知道1 <= selection <= len(response)会出现这种情况,然后您可以response[selection-1]来获取v。 (如果您对dict有任何了解,那么您可能会看到更方便的方式来编写这一切......但如果没有,请不要担心它。)

但是,如果您真的想要进行详尽的搜索,那么在任何不匹配之后您都不应该打印There is an error man,因为那样您将始终打印至少两次。相反,您只想在所有无法匹配时打印它。您可以通过跟踪匹配的&#34;来实现此目的。标记,或者在break循环中使用else:for子句,无论哪个更简单,但你必须做点什么。有关详细信息,请参阅教程中的break and continue Statements, and else Clauses on Loops

但最大的问题是raw_input返回一个字符串,并且字符串永远不会等于一个数字。例如,在交互式口译员中尝试'1' == 1,然后说False。因此,您需要做的是将用户的输入转换为数字,以便进行比较。你可以这样做:

try:
    selection = int(selection)
except ValueError:
    print "That's not a number!"
    continue

答案 1 :(得分:1)

似乎这是python中字典的工作。不确定你的作业是否允许这样做,但这是我的代码:

def make_selections(response):
   selection = raw_input('-> ')
   print response.get(selection, err_msg)

resp_dict = {
    '1':'You chose option one.',
    '2':'You chose option two.',
    '3':'You chose option three.'
}
err_msg = 'Sorry, you must pick one of these choices: %s'%sorted(resp_dict.keys())
make_selections(resp_dict)

答案 2 :(得分:0)

问题是您正在将字符串与整数进行比较。选择是原始输入,因此它以str形式出现。将其转换为int,它将按预期进行评估。

您可以使用type(var)检查变量的类型。例如,输入后的打印类型(选择)将返回“str”类型。

def make_selections(response):
    repeat = True
    while repeat == True:
        selection = raw_input('-> ')
        for i, v in enumerate(response):
            i +=1 # adds 1 to the index to make list indices correlate to a regular 1,2,3 style list
            if int(selection) == i:
                print v[1]
            else:
                print "There's an error man, what are you doing?!?!?"