본문 바로가기

공부기록/Python

[Python] yield 이용해 Progress bar 만들기

실행화면

 

import sys
import time


def ft_progress(lst):
    bar_width = 40
    count = len(lst)
    st_time = time.time()

    def show(j):
        x = int(bar_width*j/count)
        sys.stdout.write("[%s>%s] %i/%i | elapsed time %.2fs\r"
                         % ("="*x, " "*(bar_width - x - 1),
                             j, count, time.time() - st_time))
        sys.stdout.flush()
    show(0)
    for i in lst:
        yield i
        show(i + 1)
    sys.stdout.write("\n")
    sys.stdout.flush()


listy = range(300)
ret = 0
time_interval = 0.01   # 1ms

for elem in ft_progress(listy):
    sys.stdout.write("ETA : %.2fs " % (len(listy)*time_interval))
    sys.stdout.flush()
    ret += (elem + 3) % 5
    time.sleep(time_interval)
print("...")
print(ret)

몇 가지 정보들과 로딩바가 한 줄에 진행되는 형태의 로딩바는, 매번 그 행 전체를 새로 쓰면서 진행되어야 한다.

 

 yield를 사용하면 값을 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보한다. 즉 yield는 현재 함수를 잠시 중단하고 함수 바깥의 코드가 실행되도록 만든다.

 

참고

https://dojang.io/mod/page/view.php?id=2412

 

파이썬 코딩 도장: 40.1 제너레이터와 yield 알아보기

Unit 40. 제너레이터 사용하기 제너레이터는 이터레이터를 생성해주는 함수입니다. 이터레이터는 클래스에 __iter__, __next__ 또는 __getitem__ 메서드를 구현해야 하지만 제너레이터는 함수 안에서 yield

dojang.io

https://stackoverflow.com/questions/3160699/python-progress-bar

 

Python Progress Bar

How do I use a progress bar when my script is doing some task that is likely to take time? For example, a function which takes some time to complete and returns True when done. How can I display a

stackoverflow.com