Backend/Python + FastAPI

Python Basics (5)

elevne 2022. 12. 18. 21:48

오늘은 PythonGenerator에 대해 알아보았다. 

 

 

 

Generator이란 Loop의 반복 동작을 제어하는 특이한 함수다. Python의 Generator은 함수를 이용해서 Iterator을 만드는 방법인데, Generator은 함수 안에 yield 문을 사용한다. 이는 일반적인 함수와 달리 함수를 실행하고 yield 문이 나올 때까지 실행을 일시 중지하고, 그 이후에도 함수를 재시작 할 수 있도록 한다. (이를 통해서 원하는 값들의 무한 Sequence를 만들 수도 있다고 함)

 

 

 

IteratorGenerator을 흔히 혼용해서 사용하는데, 이는 Generator가 Iterator의 속성을 가지고 있기 때문이라고 한다. Generator, Iterator 각각의 next() 메서드의 차이를 보자면 Iterator의 경우에는 Container에 있는 다음 항목을 반환한다, 의 뜻을 지니는 반면 Generator의 next()는 함수를 실행하거나 마지막으로 실행된 yield 구문에서 다시 시작한다의 뜻을 가진다. 아래의 코드와 같이 Generator을 활용해볼 수 있는 것이다.

 

 

 

def main():
    yield 1
    yield 2
    yield 3

if __name__ == "__main__":
    print(main())
    for n in main():
        print(n)

 

 

result

 

 

 

위와 같이 yield 문을 여러개 포함한 Generator 함수를 생성할 수 있고, 이는 for 문 내에서 loop를 탈 수 있다. 아래와 같은 활용방식도 있다.

 

 

 

def generator():
    val = 1
    while True:
        print(val)
        val = yield

def main():
    g = generator()
    next(g)
    g.send(5)
    g.send(11)

if __name__ == "__main__":
    main()

 

 

 

위 코드를 보면 yield 를 사용하여 val 의 값을 할당하고 있는 것, next 함수, send 함수를 사용하는 것을 확인할 수 있다. send 함수와 yield 를 사용하여 함수가 실행되는 도중에 값을 전달할 수 있다. 

 

 

 

마지막으로 한 번 더 응용해서 사용해보자면, 아래와 같이 반복문을 Generator 내에 넣어 활용할 수도 있다. 

 

 

 

def my_generator(start, end):
  for i in range(start, end):
    yield i

generator = my_generator(1, 10)
print(next(generator)) # 1
print(next(generator)) # 2

 

 

 

Generator많은 메모리를 소비하지 않고 큰 크기의 시퀀스로 작업할 수 있기 때문에 유용하다. 예를 들어 Generator을 사용하여 큰 데이터 집합을 한 번에 하나의 값으로 처리하거나 너무 길어서 메모리에 모두 저장할 수 없는 일련의 값을 생성하여 사용할 수 있다.