본문 바로가기

Back-End/Python

[Python] 파이썬 알고리즘 - 제너레이터(Generator)

~ 목차 ~

제너레이터(Generator)

  • 함수를 이용해서 이터레이터(반복)의 기능을 구현
  • 이터레이터와 동일하게 호출 시점에만 메모리를 사용하고 사용이 끝나면 소멸된다.
  • 반환할 때 사용하는 명령어는 return이 아닌, yield를 사용한다.
  • 이터레이터와 동일하게 전체 또는 next() 한건씩 출력 가능
  • 메모리를 효율적으로 쓰고 싶을 때 사용(보통 시스템 구축할 때 많이 사용)

 


이터레이터(클래스 기반), 제너레이터(함수 기반)

 

 

< 제너레이터 기본 구조>

def simple_generator():
    ### 첫번째 반환할 값
    yield 1
    
    ### 두번째 반환할 값
    yield 2
    
    ### 세번째 반환할 값
    yield 3

 

제너레이터 전체 출력하기
 - 제너레이터에서는 함수를 객체로 인지하고 사용한다.
 - 함수를 생성한다는 의미 = 제너레이터 객체를 생성한다는 의미.

for v in simple_generator():
    print(v)

결과

0

1

2

3

4

 

 


<제너레이터 실습1>

 

<예제> 1부터 5까지의 숫자를 생성해서 반환하는 제너레이터 만들기
     - 함수이름 : number_generator()

def number_generator():
    for i in range(1,6):
        yield i

 

전체 출력하기
 - 함수 객체 생성하기

gen = number_generator()
for v in gen:
    print(v)

결과

1

2

3

4

5

한건씩 출력하기(try-except!)
 - 함수 객체 생성하기

gen = number_generator()

try:
    print(next(gen))
    print(next(gen))
    print(next(gen))
    print(next(gen))
    print(next(gen))
    print(next(gen))
except:
    pass

결과

1

2

3

4

5

 

 

 


< 제너레이터 실습2>

 

<예제> 파일 한줄씩 읽어서 반환하는 제너레이터 만들기

 

 -  read_lines 함수 생성

def read_lines(file_path):
    ### 파일처리 시 이터레이터와 다르게, with문을 사용해도 됩니다.
    with open(file_path, "r", encoding = "utf-8") as file:
        for line in file:
            yield line.strip()

 

제너레이터 함수 생성하기

gen = read_lines("./04_example.txt")
for v in gen:
    print(v)

 

결과

오늘의 저녁은??
백미밥
순두부백탕
카레소스
치킨너겟/강정소스
배추김치

 

 

728x90