language/Python

[Python] generator 개념 및 예제 (feat. iterator)

스파이디웹 2022. 4. 7. 23:36
728x90

1. generator란?

  • iterator를 생성해주는 함수를 의미
  • 파이썬에서는 함수 안에 yield 키워드를 사용해 만듦
  • 모든 값을 포함하여 변환하는대신 호출 할 때 마다 한개의 값을 리턴
    -> 호출 될 때 마다 리턴하기 때문에 메모리가 충분하지 않은 상황에서도 대용량의 반복 가능한 구조로 순회할 수 있음

*iterator에 대해서 모르신다면 아래의 링크를 참고해주세요.

2022.03.02 - [Python] - [Python] Iterable, Iterator 개념과 예제 및 iterator 직접 만들기

 

[Python] Iterable, Iterator 개념과 예제 및 iterator 직접 만들기

1. Iterator 순서대로 다음 값을 리턴할 수 있는 객체를 의미 Iterator는 자체적으로 내장하고 있는 next 메소드를 통해 다음 값을 가져올 수 있음 2. Iterable 내부 요소(member)를 하나씩 리턴할 수 있는 객

spidyweb.tistory.com

위의 링크에서 직접 만든 iterator코드를 generator함수가 편리하게 만들어 주는 개념이라고 보면 됩니다.


2. generator 활용해보기

  • 함수안에 return 키워드 대신에 yield 키워드를 사용하여 만듦
  • generator는 iterator를 만들어 주는 함수이므로, iterable로 부터 iterator를 만드는 것과 비교
#함수 안에 return 키워드 대신에 yield 키워드를 사용하여 만듦
def generator():
    yield 1
    yield 3
    yield 5
    yield 'a'

#generator 생성
gen = generator()

print(type(gen))# <class 'generator'> 출력
print(next(gen))# 1출력
print(gen.__next__())# 다음과 같은 방법으로도 출력이 가능하다. 3출력
print(next(gen))# 5출력
print(next(gen))# a출력
#print(next(gen)) StopIteration출력

#위의 함수는 iterable로 부터 iterator를 생성하는 다음 코드와 같다.
iterable_list = [1,3,5,'a']
iterator_list = iter(iterable_list)
print(type(iterator_list))# <class 'generator'> 출력
print(next(iterator_list))# 1출력
print(next(iterator_list))# 3출력
print(next(iterator_list))# 5출력
print(next(iterator_list))# a출력
#print(next(iterator_list)) StopIteration출력

#또 다른 generator 생성
gen2 = generator()

#생성한 두 개의 generator는 서로 다르다.
print(gen==gen2) #False출력
print(gen is gen2) #False출력

함수에 명시된 기능을 끝날 때까지 돌려주기(생성해주기) 때문에 generator라는 이름이 붙음


#n범위에 각각 1을 더하는 제너레이터
def add_one(n):
    for num in range(n):
        yield num+1

gen3 = add_one(10)
print(type(gen3)) #<class 'generator'>출력

for i in gen3:
    print(i)

#위의 제너레이터를 일반 함수로 구현
def add_one_normal(n):
    lst = []
    for num in range(n):
        lst.append(num+1)
    return lst

fnc = add_one_normal(10)
for i in fnc:
    print(i)
  • 리스트(List)를 생성해서 결과를 저장한후 출력하면 동일한 결과를 얻음
  • 값이 커질경우 일반함수로 그리고 리스트에 저장하면, 메모리에 저장하는 값이 많아져서 에러가 발생하거나 느려지기 때문에 generator를 사용함
  • 그리고 generator는 파이써닉하다(간결하다)

참조:

https://dongyeopblog.wordpress.com/2016/03/22/python-%EC%A0%9C%EB%84%A4%EB%A0%88%EC%9D%B4%ED%84%B0generator%EB%9E%80/

 

728x90