제너레이터란? 어떻게 만들까요?

Python으로 코딩 인터뷰 문제 연습하기

Kirill Smirnov

Data Science Consultant, Altran

정의

제너레이터: 함수 본문에 yield 키워드가 있어 생성되는 특별한 이터러블 객체입니다.

def func():
    # 매우 복잡한 계산의 결과를 반환
    return 0
result = func()
print(result)
0
Python으로 코딩 인터뷰 문제 연습하기

정의

제너레이터: 함수 본문에 yield 키워드가 있어 생성되는 특별한 이터러블 객체입니다.

def func():
    # 매우 복잡한 계산의 결과를 생성
    yield 0
result = func()
print(result)
<generator object result at 0x105736e10>
Python으로 코딩 인터뷰 문제 연습하기

이터러블로서의 제너레이터

def func():
    # 매우 복잡한 계산의 결과를 생성
    yield 0

result = func()
for item in result:
    print(item)
0
Python으로 코딩 인터뷰 문제 연습하기

yield 더 보기

def func():
    yield 0
    yield 1
    yield 2
result = func()
for item in result:
    print(item)
0
1
2
Python으로 코딩 인터뷰 문제 연습하기

반복문에서의 yield

def func(n):
    for i in range(0, n):
        yield 2*i
result = func(3)
for item in result:
    print(item)
0
2
4
Python으로 코딩 인터뷰 문제 연습하기

제너레이터를 리스트로 변환

def func(n):
    for i in range(0, n):
        yield 2*i

result = func(5)
list(result)
[0, 2, 4, 6, 8]
Python으로 코딩 인터뷰 문제 연습하기

이터레이터로서의 제너레이터

제너레이터는 이터러블이자 이터레이터입니다

def func(n):
    for i in range(0, n):
        yield 2*i
result = func(3)
next(result)
0
next(result)
2
next(result)
4
next(result)
StopIteration
Python으로 코딩 인터뷰 문제 연습하기

제너레이터는 소모됩니다

def func(n):
    for i in range(0, n):
        yield 2*i
result = func(3)
for item in result:
    print(item)
0
2
4
for item in result:
    print(item)
# nothing
result = func(3)
for item in result:
    print(item)
0
2
4
Python으로 코딩 인터뷰 문제 연습하기

제너레이터는 소모됩니다

def func(n):
    for i in range(0, n):
        yield 2*i
result = func(3)
list(result)
[0, 2, 4]
list(result)
[]
result = func(3)
list(result)
[0, 2, 4]
Python으로 코딩 인터뷰 문제 연습하기

제너레이터 컴프리헨션

result = [2*i for i in range(0, 3)]
print(result)
[0, 2, 4]
result = (2*i for i in range(0, 3))
print(result)
<generator object result at 0x105736e10>
Python으로 코딩 인터뷰 문제 연습하기

순회

result = (2*i for i in range(0, 3))
for item in result:
    print(item)
0
2
4
next(result)
StopIteration
Python으로 코딩 인터뷰 문제 연습하기

왜 제너레이터인가?

  • 사용자 정의 이터러블을 간단히 생성

[1, 3, 2, 4, 3, 5]

def create_jump_sequence(n):
    for i in range(1, n-1):
        yield i
        yield i+2
jump_sequence = create_jump_sequence(5)
list(jump_sequence)
[1, 3, 2, 4, 3, 5]
Python으로 코딩 인터뷰 문제 연습하기

왜 제너레이터인가?

  • 사용자 정의 이터러블을 간단히 생성
  • 지연 초기화

[1, 3, 2, 4, 3, 5, 4, 6, 5, 7, ...]

def create_jump_sequence(n):
    for i in range(1, n-1):
        yield i
        yield i+2
jump_sequence = create_jump_sequence(500)
next(jump_sequence)
1
Python으로 코딩 인터뷰 문제 연습하기

왜 제너레이터인가?

  • 사용자 정의 이터러블을 간단히 생성
  • 지연 초기화
  • 무한 이터러블도 생성 가능
def create_inf_generator():
    while True:
        yield 'I am infinite!'
inf_generator = create_inf_generator()
next(inf_generator)
I am infinite
Python으로 코딩 인터뷰 문제 연습하기

Lass uns üben!

Python으로 코딩 인터뷰 문제 연습하기

Preparing Video For Download...