代码重复运行else语句

时间:2014-01-22 20:46:14

标签: python

每次下面的代码运行时,它会直接进入第一个else语句,然后运行下一个else语句四次。发生了什么以及如何修复它以便调用movement()模块?

class square(object):
    def __init__(self,updown,leftright,residence,name):
        self.updown = updown
        self.leftright = leftright
        self.residence = bool
        self.name = name

    a1 = square(1,1,True,"a1")
    a2 = square(2,1,False,"a2")
    b1 = square(1,2,False,"b1")
    b2 = square(2,2,False,"b2")

    square_dict = {a1:"a1",a2:"a2",b1:"b1",b2:"b2"}
    movement_select()

 def movement_select():
    response = raw_input("where would you like to move?")
    if response in square_dict:
        moveTo = square_dict[response]
    else:
        print "this runs once"
    for a in square_dict:
        if a.residence == True:
            moveFrom = a
            movement(moveFrom,moveTo)
        else:
            print "this runs four times"
movement_select()

5 个答案:

答案 0 :(得分:3)

了解您如何定义residence

    self.residence = bool

因此,对于任何方格aa.residence将是bool类型,而不是布尔值True(或其他任何内容)。所以这个测试总是会失败:

    if a.residence == True:

要解决此问题,请将第一行更改为:

    self.residence = residence

虽然我们处于此状态,但您很少需要== True,因此您也可以将第二行更改为:

    if a.residence:

但这不是必要的修复,只是一种简化代码的方法。


同时,你的squares_dict有点奇怪。我不确定它是否不正确,但让我们来看看:

它从square个对象映射到它们的名称。这可能是一件有用的事情。这意味着您可以迭代dict并获取所有square s - 正如您在代码中正确执行的那样。如果您以后有square想要得到它的名字,那么您可以使用square_dict。再说一次,你可能只用一个square_list获得同样的好处,并使用已经可用的名称作为square对象的属性(除非你需要相同的square才能有不同的不同背景下的名字。)

同时,此方向的映射无法用于查找squares_dict[response],因为response是名称,而不是square。因此,您肯定需要在相反方向上进行映射,无论是作为此对象的补充还是替代。

如果你废弃了square-to-name映射并且只保留了name-to-square映射,你仍然可以迭代正方形;您只需for square in squares_dict.values():而不只是for square in squares_dict:

答案 1 :(得分:3)

第一个问题:您的词典似乎是倒退的:您想要从他们的位置查找square个对象,而不是相反。这就是为什么你的第一个条件永远不会成立。您也可以strip() response来确保您没有任何隐藏的空格。

square_dict = {"a1":a1, "a2":a2, "b1":b1, "b2":b2}
# Later...
response = raw_input("where would you like to move?").strip()
# Later still...
for a in square_dict.values(): # Because we switched the dictionary around!

如果您不想以静默方式剥离空白,我建议您至少在他们的字典中找不到的情况下回复他们的输入(print('"{}"'.format(response))),这样他们就会(你)可以确定至少输入是正确的。


第二个问题是因为您定义residence的方式。您将变量设置为bool,这根本不是您想要的。第五行应该是:

self.residence = residence

最后,还有一些关于你的代码的想法!您可以通过查看True来检查值是否为if a.residence == True:。此比较的preferred form是更简单的版本:

if a.residence:

您的方法也可以更具描述性地命名。一般来说,使用动词开始函数或方法名称总是很好的,以提高可读性。这当然是一个风格问题,但是,例如,我们看到的两个函数movement_selectmovement对于它们的功能并不十分清楚。如果他们使用标准化形式,例如,它将更容易阅读。 choose_moveperform_move

答案 2 :(得分:2)

self.residence = bool

应该是

self.residence = residence

答案 3 :(得分:1)

你没有设置住所,这是错误的:

class square(object):
    def __init__(self,updown,leftright,residence,name):
        self.updown = updown
        self.leftright = leftright
        self.residence = bool
        self.name = name

必须是

class square(object):
    def __init__(self,updown,leftright,residence,name):
        self.updown = updown
        self.leftright = leftright
        self.residence = residence  # not bool!!
        self.name = name

答案 4 :(得分:-2)

您的回复包含 \ n 符号,只需 strip()即可 您还应该在词典中的键和值之间交换位置