цикл while работает без условий

#python #while-loop #do-while

#python #цикл while #do-while

Вопрос:

Насколько я знаю, оператор while требует, чтобы условие работало, но здесь оно работает без каких-либо; как это возможно? Как это while q: работает?

Код приведен ниже: …

 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. Проблема неясна

Ответ №1:

while Цикл вычисляет любое выражение, которое задается как логическое значение. Практически все в Python имеет логическое значение. Пустые контейнеры, такие как set() обычно вычисляются до False , в то время как непустые контейнеры, такие как набор, содержащий хотя бы один элемент, вычисляются до True .

while q: поэтому может быть прочитан как «цикл, пока q он не пуст», т. Е. «Цикл до тех пор, пока q не будет вычислен до логического False значения».

Кроме того, экземпляры любого класса, который вы пишете, обычно будут оцениваться True . Вы можете изменить это, внедрив __bool__ в свой класс метод, который возвращает что-то другое.

Кроме того, q = set() работает нормально. Нет необходимости q = set([]) .

Комментарии:

1. Большое спасибо! Это не совсем очевидно (честно говоря, очень неочевидно), и документация по python в этом случае не помогла.

2. Не знаю. Я думал, что docs.python.org/3/reference / … было довольно ясно, но я понимаю, что это довольно технически для новичка, незнакомого с терминологией.

Ответ №2:

Есть условие. Цикл будет повторяться до тех пор, пока в наборе q есть элемент.

Вы получили бы аналогичный эффект, если бы написали:

 while len(q):
    # do something
 

или даже

 while len(q) > 0:
    #do something
 

Однако эти выражения можно рассматривать как, возможно, немного избыточные.