나의 작은 valley
[Python] 재너레이터(Generator) 본문
728x90
재너레이터는 미리 만들어서 보관하다가 주는 것이 아니라 필요할 때마다 만들어서 그떄그떄 제공한다.가령
일반적인 함수는 호출되면 return 값을 호출된 위치로 보내고 다시 호출되면 다시 처음부터 실행되어서 return 값을 호출된 위치로 보낸다.
따라서 가령
def function():
""""아무말"""
return 사과
print("안녕?")
같은 함수를 아무리 여러번 호출해도 print("안녕?")을 할 수 없다.
<재너레이터>
def word_generator():
yield "사과"
yield "딸기"
yield "바나나"
for word in word_generator():
print(word)
#사과
#딸기
#바나나
yield는 기능적으로 return과 유사하지만 다음번에 호출 됐을 떄 처음부터가 아닌 yield 다음부터 시작된다는 점에서 함수와 다르다.
<yield할 값이 없는 시점이 되면 어떻게 될 까?>
def word_generator():
print("Step 1")
yield "사과"
print("Step 2")
yield "딸기"
print("Step 3")
yield "바나나"
print("Step 4")
g = word_generator()
print("START")
print(next(g)) # 사과
print("A")
print(next(g)) # 딸기
print("B")
print(next(g)) # 바나나
print("C")
print(next(g)) # StopIteration
print("D") # 실행되지 않음
StopIteration Error를 내부적으로 반환한다. 따라서 D는 출력되지 않는다.
<제너레이터 표현식>
:리스트 컴프레이션과 유사하게 제너레이터도 표현식이 존재한다.
a = (x*x for x in range(5))
print(type(a))
print(a) # 리스트와 달리 제너레이터 객체에 대한 정보가 출력됨
결과물)
<class 'generator'>
<generator object <genexpr> at 0x000001B64FA819E0>
<그 이유는 다음과 같다...>
def square(x):
print("square() called")
return x * x
print("Check 1")
a = (square(x) for x in range(5))
print("Check 2")
a = list(a)
print("Check 3")
print(a)
결과물)
Check 1
Check 2
square()
called square()
called square()
called square()
called square()
called Check 3
[0, 1, 4, 9, 16]
바로 제너레이터 그 자체는 어떠한 아이템을 가지고 있지 않기 떄문이다.
제너레이터를 list등으로 만드는 시점에서 square()가 called 된 것을 확인가능하다.
비슷한 예로 map()함수 역시 비슷한 원리로 작동한다. 필요할 때마다 만들어서 쓴다
<yield from>
yield from (다른 이터러블, 다른 제너레이터등)을 쓸 수 있다.
ex)
def my_range(start, stop):
while start < stop:
yield start
start += 1
def my_generator(start, stop):
yield from my_range(start, stop) # 다른 제너레이터
for i in my_generator(1, 5):
print(i, end=" ")
728x90
'Computer Science > [Python] 문법 정리' 카테고리의 다른 글
[Python] AsynciO 코루틴(Native coroutine) (0) | 2022.08.23 |
---|---|
[Python] 제너레이터 기반 코루틴(coroutine) (0) | 2022.08.23 |
[Python] 이터레이터(Iterator) (0) | 2022.08.20 |
[Python] 명령줄 인수 (0) | 2022.08.20 |
[Python] 멀티프로세스(Multi-Process) (0) | 2022.08.19 |
Comments