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 직접 만들기
위의 링크에서 직접 만든 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는 파이써닉하다(간결하다)
참조:
728x90