본문 바로가기

프로그래밍/파이썬

[파이썬] 제너레이터(Generator) 이해하기

decorator

제너레이터(Generator)

1. 기존 방식

######################################### 기본 예제 
def square_numbers(nums):
    result = []
    for i in nums:
        result.append(i*i)
    return result
 
my_nums = square_numbers([1,2,3,4,5])
print(my_nums)
print(type(my_nums))
 
>>> 출력결과
> [1, 4, 9, 16, 25]
> <class 'list'>
>
######################################### 제너레이터로 만들기 
 
def square_numbers(nums):
    for i in nums:
        yield i * i
 
my_nums = square_numbers(([1,2,3,4,5]))
print(my_nums)
>>> 출력결과
> <generator object square_numbers at 0x7eff006e1f10>

2. 제너레이터 만들기

by_list_comprehension = [ x * x for x in [1,2,3,4,5]]
by_generator = ( x * x for x in [1,2,3,4,5])
print(by_list_comprehension)
print(by_generator)

제너레이터는 괄호 ( ) 를 이용하면 만들 수 있습니다.
제너레이터를 출력하는 법은 #3에서 알아보도록 하겠습니다.

3. 제너레이터 출력하기

똑같은 기능을 하는 것 같지만 아래 예제는 generator objectd를 만들어낸다.
제너레이터(generator)의 값을 출력하기 위해서는 next라는 특이한 명령어를 이용한다.

3-1. next를 이용해 출력하기

print(next(my_nums))를 입력해보면 1이 출력된다.
다음 값을 출력하기 위해서는 한번 더 print(next(my_nums))를 입력해야 한다.
그렇게 총 5번을 입력하고 6번째에는 더 이상 전달할 값이 없다는 의미StopIteration이 출력된다.

3-2. for문을 이용해 출력하기

제너레이터를 출력하기 위해서는 보통 for문을 이용한다.

def square_numbers(nums):
    for i in nums:
        yield i * i
 
my_nums = square_numbers(([1,2,3,4,5]))
for num in my_nums:
    print(num)

3-3 list로 변환해서 출력하기

by_generator = ( x * x for x in [1, 2, 3, 4, 5] )
print(by_generator)
print(list(by_generator))
>>> 출력결과
> <generator object <genexpr> at 0x1006c8f50>
> [1, 4, 9, 16, 25]

리스트로 변환하면 쩨너레이터가 갖는 퍼포먼스를 잃으니 주의하자.

4. 제너레이터의 퍼포먼스

num = [ x for x in range(130)]

위와 같이 작은 수의 리스트 컴프리헨션은 괜찮다.
하지만 자료가 만 개, 백 만개 정도라면 제너레이터 표현식을 권장한다.

제너레이터 표현식은 출력 시퀀스를 메모리에 로딩하지 않는다.
iterator로 한 번에 한 출력만 만들기 때문이다.