Правильное строение цикла для красивого progress bar

Хочу использовать progress bar, который рисует в таком формате: X/Y, где X - текущая итерация, Y - последняя итерация. Цикл должен работать от начальной до конечной итерации включительно.

Например, если X = 1, Y = 5, то должно выводится: 1/5 -> 2/5 -> 3/5 -> 4/5 -> 5/5 (без 0 и 6, т.е. не сколько выполнено, а на какой итерации мы сейчас).

Пробую так:

import contextlib
import time

import tqdm

start = 1
end = 5
cur = start
condition = start <= end

with contextlib.closing(tqdm.tqdm(initial=start, total=end)) as progress_bar:
    while condition:
        time.sleep(1)

        cur += 1
        progress_bar.update()
        condition = cur <= end 

Однако после 5/5 он из-за лишнего апдейта рисует 6 и останавливается. Можно как-то избежать этого последнего 6 без двойной проверки в цикле?


Ответы (2 шт):

Автор решения: MBo

Лишнего чего-то навертели...

while cur <= end:
    time.sleep(1)
    progress_bar.update()
    cur += 1
→ Ссылка
Автор решения: CrazyElf

Вот так вроде нормально отрабатывает:

cur += 1
condition = cur <= end
if condition:
    progress_bar.update()

Получается, что update на последней итерации цикла уже лишний (именно он выставляет и отображает значение 6), его надо как-то исключить.

Можно чуть сократить код, если вспомнить, что True = 1, False = 0:

cur += 1
condition = cur <= end
progress_bar.update(condition)

Вариант без двойной проверки условия:

with contextlib.closing(tqdm.tqdm(initial=start, total=end)) as progress_bar:
    while True:
        time.sleep(1)

        cur += 1
        if cur > end:
            break
            
        progress_bar.update()
→ Ссылка