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 반복가능한객체)