작성
·
187
0
RESETS = [
False, False, False, True, False, True, False,
False, False, False, False, False, False, False]
def check_for_reset():
# 외부 이벤트를 폴링한다
return RESETS.pop(0)
def announce(remaining):
print(f'{remaining} 틱 남음')
class Timer:
def __init__(self, period):
self.current = period
self.period = period
def reset(self):
self.current = self.period
def __iter__(self):
while self.current:
self.current -= 1
yield self.current
#
def run():
timer = Timer(4)
for current in timer:
if check_for_reset():
timer.reset()
announce(current)
run()
결과 :
안녕하세요!! 파이썬 class 및 제너레이터에 대해 질문드립니다!!
위 코드를 보면 timer라는 인스턴스가 루프를 돌면서 announce를 호출 하는 코드인데
이해가 안되는 점이 왜 RESETS 리스트의 데이터가 pop이 되는 걸까요???
for문이 돌고는 있지만 실질적으로 check_for_reset 함수는 호출되고 있지 않자나요??
근데 결과를 보면 for문 돌면서 계속 RESETS 리스트의 데이터가 pop되고 있는 게 신기하네요
class iter메소드가 아닌 그냥 for문 돌리면 그냥 일반적인 예상대로 RESTS리스트의 데이터는 그대로 존재하는데 말이죵;;
Timer라는 클래스랑 RESETS 리스트랑 코드상 직접적인 관계가 없는데 같이 맞물려 동작하는게 이해가 안되네요 ;;;
어떠한 원리에 의해서 위와 같이 동작하는걸까요!!??
답변 1
0
안녕하세요.
아래 코드에서 for 반복 시마다 check_for_reset() 함수를 호출하고 계시니, 말씀하시는 대로 동작하는 것이 맞습니다.
Timer를 iterator 객체로서 구현하셨고, 구현하신 대로 동작하고 있습니다. 아래와 같이 for 순회 시에 timer 객체를 list(timer)로 감싸시면, 동작이 달라질 것입니다.
Iterator/Generator에 대해서 차근차근 정리해보세요.
화이팅입니다. :-)