2011-03-08 9 views
2

以下は、Pythonで単純な電卓を作成する特定のクラスのメソッドです。whileループのpythonの質問

def getButton(self): 
    while True: 
     p = self.win.getMouse() 
     for b in self.buttons: 
      if b.clicked(p): 
       return b.getLabel() 

self.buttons変数はすべて電卓のボタンのリストである:クリックされるボタンを待っているそのボタンのラベルを返すことを意図しています。 Clickedは、ボタンがクリックされたかどうかをチェックするメソッドです。私が理解していないのは、while whileループwhile while trueです。真であるか間違っているとテストしていますか?どのような場合にはそれは真実ではないでしょうか?

答えて

4

これはbusy waitの例です。このプログラムはこのループに詰まり、self.buttonsのいずれかのボタンbがクリックされたかどうかを永遠にチェックします。この時点で、ビジー状態から復帰してbのラベルを返します。

したがって、本質的には、それはの何もかものテストではありません。条件が満たされるまで待っているだけです。

つまり、ビジー待機はanti-patternとみなされます。このコードベースを制御できれば(これは単なる玩具アプリケーションではありません)、この条件を大きなアプリケーションのメインループの一部としてチェックできるかどうか、またはそのオブジェクトがそのイベントが(コールバックや別のスレッドで)待っていました。

1

これはテストしていません。

while Trueは、永遠にループすることを意味します。 Whileは式が偽になるまでループします。真は決して偽ではない。

2

真は常に真です。 whileループは、returnステートメントを実行するときに "手で"終了するまで、永遠に実行されます。

1

infiteループを終了するいくつかの方法があります

  • returnは、現在の関数(および関数内それによってすべてのループ)を出る唯一の電流ループ
  • 任意のキャッチされない
  • break出口は例外
  • また、サーバーのケースなど、無限ループが必要な場合もあります。 sys.exitまたは同様のプロセス終了メソッドを呼び出すことによってそれを殺すことができます。
1

while、ifなどの制御メカニズムはブール値をチェックします。 "a == 5"のような典型的なチェックは真または偽である。しかし、単に「真」と入力することもできます。この場合、条件は常に真です。

つまり、「while true」は無限ループであり、return b.getLabel()ステートメントに達するまでコードは実行を停止しません。

0

私が与えることができる唯一の提案は、それはいつもボタンのクリックを聞いているような無限ループにそれを送ることです。ボタンがクリックされたら、そのループ内に出口を記述する必要があります。