2017-01-09 27 views
0

ボードゲームで座標(x、y)から(u、v)にピースを移動するためのmove(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.") 

移動が可能な場合、関数はボード上の駒を移動し、移動が可能でないとき、それは「不可能移動」と言う文字列を返します。

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

と私はので、私は移動後の動きをしようとして続けることができます無限ループにそれを置く:

は私がseconde機能を作ったので、私の人生を簡素化するために、行うには多くのテストを持っています。

while True: 
    play() 

全部が正常に動作して、作品はゲームのルールに従って移動され、すべてが移動が不可能であるとき、私は「移動不可能」のメッセージを取得しないことを除いて結構です。

私はplay()を(例えばシェルのwhileループの外で)呼び出し、不可能な移動を試みると、メッセージを受け取ります。

私はこれが非常に基本的なものだと確信していますが、私はどこでも答えを見つけることができませんでした。私はコードでエラーを見つけるためにこれらのメッセージが必要です。

明確でない場合の例を追加します。 (0,0)から(1,1)への移動が不可能であるとしましょう。

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

ケース2、(遊ぶ)ループ内:

ケース1、ループなし()プレイする動きが再生されない

while True: 
    play() 

0011 

0011 

... 

(作品は、その場所にとどまります)しかし、私はメッセージを取得しません。何故ですか?

EDIT:問題を解決しました。

print(play()) 

仕事が、私がしなければならなかったすべてはあなたが実行すると

return(print("Impossible move")) 

代わりの

return("Impossible move") 

はあなたに助け:)

+2

[MCVE]を入力してください。 – TigerhawkT3

+0

あなたのコードでは、「不可能な」移動を返す部分は見られませんか? –

+0

条件が満たされない場合、関数moveは "不可能になります"を返します。このコードにもう1つの例を追加します – 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())を使用してください。

関連する問題