2016-10-14 5 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 루프는 부울로 지정된 모든 표현식을 평가합니다. 거의 모든 것은 파이썬에서 부울 값을가집니다. set()과 같은 빈 컨테이너는 일반적으로 False으로 평가되는 반면, 비어 있지 않은 컨테이너 (예 : 하나 이상의 요소가있는 집합)는 True으로 평가됩니다. "q이 비어 있지 동안 루프"

while q: 따라서, 즉, "루프가 한 qFalse을 논리 값으로 평가하지 않습니다"로 읽을 수 있습니다.

작성하는 클래스의 인스턴스는 일반적으로 True으로 평가됩니다. 클래스에서 다른 것을 반환하는 __bool__ 메소드를 구현하여이를 수정할 수 있습니다.

또한 q = set()도 정상적으로 작동합니다. q = set([])은 필요 없습니다.

+0

고마워요! 명확하지는 않지만 (솔직히 말해서 매우 명확하지는 않습니다.)이 경우에는 파이썬 문서가 도움이되지 않습니다. –

+0

Dunno. 나는 https://docs.python.org/3/reference/compound_stmts.html#the-while-statement가 꽤 명확하다고 생각했지만 용어에 익숙하지 않은 초보자에게는 꽤 기술적 인 것으로 알고있다. –

1

조건이있다. 루프는 set q에 요소가있는 한 반복됩니다. 당신이 쓴 경우

당신은 유사한 효과를 얻을 것이다 :

while len(q): 
    # do something 

또는

while len(q) > 0: 
    #do something 

은 그러나이 표현은 아마도 약간의 중복으로 볼 수 있습니다.

관련 문제