有没有办法在repr()函数中使用for循环?

时间:2019-04-05 15:02:26

标签: python

我想在调用Nim游戏的repr()函数时打印有关Nim游戏状态的信息。但是,我不知道repr()函数中如果没有循环,它将如何工作。

class NimGame:

    def __init__(self, listOfNumBalls):
        self.listOfNumBalls = listOfNumBalls

    def __repr__(self):
        for num in range(len(self.listOfNumBalls)):
            return "Heap {}: {} balls".format(num,self.listOfNumBalls[num])

使用“ newGame = NimGame([1,2,3])”之类的游戏, 我希望它返回以下内容:

“堆1:1个球

堆2:2个球

堆3:3个球”

3 个答案:

答案 0 :(得分:2)

当然,您可以在方法中使用for,就像其他任何代码一样。但是,您在这里犯了两个错误:首先,return结束了调用,因此您的代码永不重复。其次,这不是repr的用途:

  

如果可能的话,这应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值的对象(在适当的环境下)。

因此,适合您的对象的repr"NimGame([1,2,3])",例如"NimGame({!r})".format(self.listOfNumBalls)

您尝试实现的方法更适用于str,例如:

def __str__(self):
    return "\n".join("Heap {}: {} balls".format(i,v) 
                     for (i,v) in enumerate(self.listOfNumBalls, start=1))

答案 1 :(得分:0)

如果您返回-您将返回。您的for循环中尚未执行的任何循环都不会执行。

构造完整的字符串,并将其返回:

class T:
    def __init__(self,listOfNumBalls):
        self.listOfNumBalls = listOfNumBalls

    def __repr__(self):
        return '\n'.join( 
            ("Heap {}: {} balls".format(i,v) for i,v in enumerate(self.listOfNumBalls,1) ) )


print( repr(T( ["b {}".format(i) for i in range(5)] )))

输出:

Heap 1: b 0 balls
Heap 2: b 1 balls
Heap 3: b 2 balls
Heap 4: b 3 balls
Heap 5: b 4 balls

答案 2 :(得分:0)

“ return”语句结束代码块。因此,您的repr()函数仅运行一次。相反,您可以将其附加到字符串并在for循环之后返回,如下所示:

class NimGame:

    def __init__(self, listOfNumBalls):
        self.listOfNumBalls = listOfNumBalls

    def __repr__(self):
        returnval = ""
        for num in range(len(self.listOfNumBalls)):
            returnval += "Heap {}: {} balls".format(num + 1,self.listOfNumBalls[num]) + "\n"
        return returnval

这将在打印时显示您的预期输出。