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
https://stackoverflow.com/questions/3160699/python-progress-bar
'공부기록 > Python' 카테고리의 다른 글
파이썬 정규표현식 이용해 문장부호 지우기 (2) | 2020.05.21 |
---|---|
jupyter notebook 코드 티스토리에 업로드하기 (0) | 2020.05.20 |
점프투파이썬 종합문제 Q16 모스부호 해독 Morse code decoder (0) | 2020.05.15 |
점프투파이썬 종합문제 Q13 DashInsert (0) | 2020.05.14 |