728x90
반응형
40. 제너레이터(발생자)
이터레이터를 생성해주는 함수
- 이터레이터는 클래스에 __iter__, __next__ 또는 __getitem__메서드를 구현해야 하지만,
제너레이터는 함수 안에서 yield라는 키워드만 사용하여 간단하게 작성할 수 있다.
40.1 제너레이터와 yield
def number_generator():
yield 0
yield 1
yield 2
for i in number_generator():
print(i)
==========================
0
1
2
# 제너레이터 객체가 이터레이터인지 확인
g = number_generator()
print(g)
# 이터레이터와 동일하게 동작
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__()
==========================
<generator object number_generator at 0x1027fb510>
0
1
2
Traceback (most recent call last):
File "/Users/cheryl/Documents/workspace/practice2022/python-coding/40.py", line 40, in <module>
print(g.__next__())
StopIteration
# for와 제너레이터
def number_generator():
yield 0 # 0을 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보
yield 1 # 1을 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보
yield 2 # 2를 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보
g = number_generator()
# 이터레이터와 동일하게 동작
a = next(g)
print(a)
b = next(g)
print(b)
c = next(g)
print(c)
==========================
0
1
2
- return : 제너레이터는 함수 끝까지 도달하면 StopIteration예외가 발생하는데, 이때 return 값을 설정해놓으면 해당 리턴값이 예외의 에러메세지로 들어간다.
def one_generator():
yield 1
return 'return value'
try:
g = one_generator()
next(g)
next(g)
except StopIteration as e:
print(e)
==========================
return value
40.2 제너레이터
def number_generator(stop):
n = 0
while n < stop:
yield n
n += 1
for i in number_generator(3):
print(i)
print(lineBoard)
==========================
0
1
2
# 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)
==========================
APPLE
PEAR
GRAPE
PINEAPPLE
ORANGE
40.3 yield from으로 값을 여러 번 바깥으로 전달
def number_generator():
x = [1, 2, 3]
for i in x:
yield i
for i in number_generator():
print(i)
==========================
1
2
3
# yield from 반복 가능한 객체, 이터레이터, 제너레이터 객체
# python 3.3 이상부터 사용 가능
def number_generator():
x = [1, 2, 3]
yield from x
for i in number_generator():
print(i)
==========================
1
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)
==========================
0
1
2
# 제너레이터 표현식
# 리스트 표현식을 ()로 묶으면 제너레이터 표현식이 되고,
# 제너레이터 표현식은 필요할 때 요소를 만들어내므로 메모리를 절약할 수 있다.
print([i for i in range(50) if i % 2 == 0])
print((i for i in range(50) if i % 2 == 0))
==========================
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48]
<generator object <genexpr> at 0x104678900>
728x90
반응형
'Language > Python' 카테고리의 다른 글
[코딩도장]42.데코레이터 (0) | 2022.04.12 |
---|---|
[코딩도장]41.코루틴 (0) | 2022.04.11 |
[코딩도장]39. 이터레이터 (0) | 2022.04.05 |
[코딩도장]38.예외처리 (0) | 2022.04.04 |
[코딩도장]37.두 점 사이의 거리 구하기 (0) | 2022.04.01 |