[python] 제너레이터 사용하기

anjiyoo·2024년 3월 20일

Python

목록 보기
38/41
post-thumbnail

1.제너레이터

  • 이터레이터를 생성해주는 함수
  • 이터레이터는 클래스에 __iter__, __next__, __getitem__ 메소드를 구현해야함
  • 제너레이터는 함수 안에서 yield라는 키워드만 사용함
def 제너레이터이름():  # 제너레이터 함수를 만듦
	yield 값  # yield로 값을 발생시킴
    
제너레이터객체 = 제너레이터()  # 제너레이터 객체 생성
제너레이터객체.__next__()  # __next__메소드를 호출하면 yield에 지정한 값이 반환값으로 나옴
next(제너레이터)  # next 함수 사용

for i in 제너레이터():  # 제너레이터를 반복문에 사용
	pass

1-1.제너레이터와 yield 알아보기

  • 제너레이터는 제너레이터 객체에서 __next__ 메소드를 호출할 때마다
    함수 안의 yield까지 코들르 실행하며 yield에서 값을 발생시킴
yield 값
def number_generator():
	yield 0
    yield 1
    yield 2
    
for i in number_generator():
	print(i)
  • for 반복문은 반복할 때마다 __next__를 호출하므로 yield에서 발생시킨 값을 가져옴

1-2.제너레이터와 return

  • 제너레이터는 함수 끝까지 도달하면 StopIteration 예외가 발생
  • return을 사용해서 함수 중간에 빠져나오면 StopIteration 예외가 발생
  • 제너레이터 안에서 return에 반환값을 지정하면 StopIteration 예외의 에러 메시지로 들어감
def one_generator():
	yield 1
    return 'return에 지정한 값'

try:
	g = one_generator()
    next(g)
    next(g)
except StopIteration as e:
	print(e)  # return에 지정한 값

2.range()처럼 제너레이터 만들기

def number_generator(stop):
	n = 0  # 숫자는 0부터 시작
    whiel n < stop:  # 현재 숫자가 반복을 끝낼 숫자보다 작을 때 반복
    	yield n  # 현재 숫자를 바깥으로 전달
        n += 1  # 현재 숫자를 증가시킴
        
for i in number_generator(3):
	print(i)

2-1.yield에서 함수 호출하기

  • yield에서 함수(메소드)를 호출하면 해당 함수의 반환값을 바깥으로 전달
    upper는 호출했을 때 대문자로 된 문자열을 반환
    yield는 이 문자열을 바깥으로 전달
  • yield에 무엇을 지정하든 결과만 바깥으로 전달
def upper_generator(x):
	for i in x:
    	yield i.upper()  # 함수의 반환값을 바깥으로 전달

fruits = ['apple', 'pear', 'grape', 'pineapple', 'orange']

for i in upper_generator(fruits):
	print(i)

2-2.yield from으로 값을 여러 번 바깥으로 전달하기

def number_generator():
	x = [1, 2, 3]
    for i in x:
    	yield i
        
for i in number_generator():
	print(i)
  • for 또는 while 반복문 대신 yield from을 사용
yield from 객체
yield from 이터레이터
yield from 제너레이터
def number_generator():
	x = [1, 2, 3]
    yield from x  # 리스트에 들어있는 요소를 한 개씩 바깥으로 전달
    
for i in number_generator():
	print(i)

2-3.yield from에 제너레이터 객체 지정하기

def number_generator(stop):
	n = 0
    while n < stop:
    	yield n
        n += 1
        
def three_generator():
	yield from number_generator(3)  # 숫자를 세 번 바깥으로 전달
 
for i in three_generator():
	print(i)
  • number_generator(3) 은 숫자를 세 개 만들어내므로 숫자를 세 번 바깥으로 전달

제너레이터 표현식

  • 리스트 표현식을 사용할 때 [ ]을 사용
  • 같은 리스트 표현식을 ( )로 묶으면 제너레이터 표현식이 됨
  • 리스트 표현식은 처음부터 리스트 요소를 만들어내지만
    제너레이터 표현식은 필요할 때 요소를 만들어내므로 메모리를 절약할 수 있음
(식 for 변수 in 반복가능한객체)
profile
기록으로 흔적을 남기는 것을 좋아합니다

0개의 댓글