2017-01-09 106 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())

相關問題