2017-01-09 104 views
0

我有第一个函数move(x,y,u,v),用于在棋盘游戏中将棋子从坐标(x,y)移动到(u,v)。Python:为什么在while循环中调用的函数会返回与单独调用不同的东西?

some_Class(): 
    def move(self, x, y, u, v): 

     self.x = x 
     self.y = y 
     self.u = u 
     self.v = v 

     if (conditions for possible move...): 
      return(some_function(self.x, self.y, self.u, self.v)) ## applies the move 

     else: 
      return("Move impossible. Try again.") 

当移动是可能的,该函数将移动电路板上的片和当移动是不可能的,它返回一个字符串,表示“移动不可能”。

我有很多的测试要做,所以简化了我的生活我做了一个功能Seconde系列:

def play() 
    a = input() 
    b = [] 
    for i in a: 
     b.append(i) 
    return(move(b[0], b[1], b[2], b[3])) 

,我把它放在一个无限循环,这样我就可以不断尝试移动后的举动。

while True: 
    play() 

整件事正常工作,棋子按照游戏规则感动,一切都很好,只是当移动是不可能的我不明白“移动不可能”的消息。

如果我自己调用play()(在while循环之外,例如在shell中),并尝试一个不可能的动作,我确实收到了这条消息。

我很确定这是非常基本的东西,但我无法找到答案的任何地方,我需要这些消息,因为我用它们来定位代码中的错误。

如果不清楚,我会添加一个示例。假设从(0,0)移动到(1,1)是不可能的。

案例1,播放(),而不循环:

>>>play() 
0011 
'Move impossible. Try again.' 

案例2中,打()在一个循环内:

while True: 
    play() 

0011 

0011 

... 

此举不播放(片停留在其位置),但我没有收到消息。这是为什么?

编辑:问题解决了。

print(play()) 

没有工作,但我不得不这样做是

return(print("Impossible move")) 

,而不是

return("Impossible move") 

谢谢大家的帮助:)

+2

请提供[MCVE]。 – TigerhawkT3

+0

但是在你的代码中,我没有看到返回“”不可能“的部分? –

+0

当条件不满足时,功能移动返回“移动不可能”。我会为这个添加一个例子 – Peyolikepeyote

回答

4

您的功能返回一个字符串。当你从解释器调用它时,它会自动打印,因为它是你正在运行的语句的结果,但是如果它在while循环中,你需要明确地打印它以显示出来。字符串被返回,但是你没有对返回值做任何事情。

试试这个:

while True: 
    print(play()) 

顺便说一句,这是原因,为什么同样的方式返回错误作为有效的结果可能是一个问题之一。当出现无效移动时,最好引发异常,然后使用try/except来处理错误情况。

例如:

# (in move): 
if valid_move(...): 
    return(do_move(...)) 
else: 
    raise ValueError("Move impossible, try again") 

# (in play): 
try: 
    move(...) 
except ValueError as err: 
    print(err) 
3

当您运行play()在交互式提示符下,Python打印表达式的值(它的返回值)。

在循环内部,这不一定发生。你不会对表达做任何事情,所以价值就会被抛弃。 (使用基本的Python REPL,它实际上在循环内打印出裸值;但是IPython不会)。

因此,如果要查看结果,请使用print(play())

相关问题