2016-10-14 9 views
1

私の知る限り、ステートメントは動作するための条件が必要ですが、ここでは何もせずに動作します。それはどのように可能ですか? while q:はどのように機能しますか?whileループは条件なしで動作します

コードは以下の通りです: ...

q = set([]) 
for i in range(N): 
    q.add((i, 0)) 
    q.add((i, M - 1)) 
    w[i][0] = h[i][0] 
    w[i][M - 1] = h[i][M - 1] 
for i in range(M): 
    q.add((0, i)) 
    q.add((N - 1, i)) 
    w[0][i] = h[0][i] 
    w[N - 1][i] = h[N - 1][i] 

while q: 
    ci, cj = q.pop() 
    for ii, jj in ((0, 1), (0, -1), (1, 0), (-1, 0)): 
     ni, nj = ci + ii, cj + jj 
     if 0 <= ni < N and 0 <= nj < M: 
      if w[ni][nj] != h[ni][nj] and (w[ni][nj] is None or w[ni][nj] > w[ci][cj]): 
       w[ni][nj] = max(h[ni][nj], w[ci][cj]) 
       q.add((ni, nj)) 
+1

不明な問題 –

答えて

6

whileループは、ブール値として与えられた式を評価します。 Pythonのほとんどすべてがブール値を持っています。 set()のような空のコンテナは、一般にFalseと評価されますが、少なくとも1つの要素を持つセットなどの空でないコンテナは、Trueと評価されます。 「限りqFalseをブール値に評価されないようにループ」、すなわち、「qが空でないながらループ」

while q:したがってとして読み取ることができます。

あなたが書いたクラスのインスタンスは、通常、Trueと評価されます。これを変更するには、クラス内に__bool__メソッドを実装して、何か他のものを返します。

また、q = set()も問題ありません。 q = set([])の必要はありません。

+0

ありがとうございます!非常に明白ではありません(正直であるとはっきりと分かりません)。この場合、pythonのドキュメントは役に立ちませんでした。 –

+0

Dunno。私はhttps://docs.python.org/3/reference/compound_stmts.html#the-while-statementはかなり明確だと思っていましたが、用語になじみのない初心者にとってはかなり技術的であることを理解しています。 –

1

条件があります。 ループは、集合qに要素がある限り繰り返されます。

あなたが書いた場合は、同様の効果を得るでしょう:

while len(q): 
    # do something 

あるいは

while len(q) > 0: 
    #do something 

をしかし、これらの式は、おそらく少し冗長と見なすことができます。

関連する問題