Правильное строение цикла для красивого 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 шт):
Лишнего чего-то навертели...
while cur <= end:
time.sleep(1)
progress_bar.update()
cur += 1
Вот так вроде нормально отрабатывает:
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()