Developer_Neo
[python] 제너레이터 함수 본문
반응형
제너레이터
- iterator객체의 한 종류로 next함수를 호출하면 값을 하나씩 얻을 수 있다.
제너레이터를 함수기반으로 만드는 법
yield가 들어갈것! yield가 하나라도 들어가면 제너레이터가 된다.
def num_generator():
print('first')
yield 0
print('second')
yield 1
print('third')
yield 2
>>> def num_generator():
print('first')
yield 0
print('second')
yield 1
print('third')
yield 2
>>> gen=num_generator()
>>> next(gen)
first
0
>>> next(gen)
second
1
>>> next(gen)
third
2
>>> next(gen)
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
next(gen)
StopIteration
이렇게 함수 호출 이후에 그 실행의 흐름을 next함수가 호출될 때까지 미루는 특성을 lazy evaluation이라고 한다.
제너레이터는 iterator객체 처럼 동작한다.
제너레이터가 갖는 의미
-> 메모리 공간을 적게 사용할 수 있다.
>>> import sys
>>> def poww(s):
r=[]
for i in s:
r.append(i**2)
return r
>>> st=poww([1,2,3,4,5,6,7,8])
>>> for i in st:
print(i,end=' ')
1 4 9 16 25 36 49 64
>>> sys.getsizeof(st)
120
>>> def gpows(s):
for i in s:
yield i**2
>>> s=gpows([1,2,3,4,5,6,7,8])
>>> for i in s:
print(i,end=' ')
1 4 9 16 25 36 49 64
>>> sys.getsizeof(s)
112
앞서 보았던 map과 filter함수가 반환하는 것은 iterator객체이자 제너레이터 객체이다.
yield form
def get_nums():
ns=[0,1,0,1,0,1]
yield from ns
g=get_nums()
next(g) # 0
next(g) # 1
yield from 을 쓰면 다음에 오는 변수에 대해서는 yield가 적용된다.
제너레이터 표현식
( 표현식 for 변수 in iterable객체)
def show_all(s):
for i in s:
print(i, end=' ')
def times2():
for i in range(1,6):
yield 2 * i
g=times2()
show_all(g)
# 2 4 6 8 10
g = ( 2 * i for i in range(1,6)) #제너레이터 표현식
show_all(g)
# 2 4 6 8 10
show_all(( 2 * i for i in range(1,6)))
# 2 4 6 8 10
제너레이터 함수와 제너레이터표현식을 비교해봤을 때의 장점은 제너레이터표현식이 더 간결히 표현이 가능하다.
그런데 식이 복잡해지면 이 장점을 잃어버리니 상황별로 함수나 표현식을 적절히 쓰는 것이 좋다.
반응형
'프로그래밍 > Python' 카테고리의 다른 글
[python] 클래스 상속, 메소드 오버라이딩, __init__ 메소드의 오버라이딩 (0) | 2022.01.19 |
---|---|
[python] 네임드 튜플 (0) | 2022.01.19 |
[python] Iterable객체와 Iterator객체 (0) | 2022.01.18 |
[python] 컴프리헨션(Comprehension) (0) | 2022.01.18 |
[python] 가비지컬렉션과 레퍼런스 카운트 (0) | 2022.01.18 |
Comments