다른 언어들을 배우면서 iterator 개념은 많이 보고 사용해봤지만, python을 하며 generator에 대해서는 처음들었다. iterator와 비슷한듯 달라서 이걸 도대체 왜쓰는거지..??😑라는 의문이 들었는데, 공부하다보니 오..이런것도 있구나 싶었다👀
이번에 generator에 대해 이해한 내용을 정리해 보고자 한다!! 🙌
제너레이터는 반복자(iterator)와 같은 루프의 작용을 컨트롤하기 위해 쓰여지는 특별한 함수 또는 루틴이다.( 이터레이터를 생성해주는 함수 )
['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__iter__', '__le__', '__lt__', '__name__', '__ne__',
'__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code',
'gi_frame','gi_running', 'gi_yieldfrom', 'send', 'throw']
__next__
, __iter__
함수 둘다 가지고 있는 것을 확인 할 수 있다. iterator와 다르게 바로 __next__
함수를 실행 할 수 있다.
일반 함수와 다르게 generator는 return 값 대신 yield를 사용하여 값을 산출한다.
일반 함수
def sum(a, b):
return a+b
➡️ return 후 함수 종료
generator
def sum(a, b):
yield a+b
➡️ yield를 만나면 호출 부분으로 값을 반환해준 뒤, 함수 상태 유지
다음 next()를 할 경우 함수 처음부터가 아닌 yield 이후부터 다시 실행된다.
send() 사용 시 generator 실행 중간에 값을 보낼 수 있다.
def sum(a):
b = yield
yield a + b
s = sum(1)
next(s)
print(s.send(2))
generator를 간단하게 표현 하는 방법
list comprehension과 사용법이 비슷하다. [] 대신 () 사용
def print_iter(iter):
for element in iter:
print(f"e={element}")
L = [1, 2, 3]
result = (x for x in L)
print_iter(result)
import time
def print_iter(iter):
for element in iter:
print(element)
def lazy_return(num):
print("sleep 1s")
time.sleep(1)
return num
print("comprehension_list=")
comprehension_list = [ lazy_return(i) for i in L ]
print_iter(comprehension_list)
print("generator_exp=")
generator_exp = ( lazy_return(i) for i in L )
print_iter(generator_exp)