Notice
Recent Posts
Recent Comments
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
10-11 00:15
Archives
Today
Total
관리 메뉴

Developer_Neo

[python] 제너레이터 함수 본문

프로그래밍/Python

[python] 제너레이터 함수

_Neo_ 2022. 1. 18. 19:25
반응형

제너레이터

- 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

제너레이터 함수와 제너레이터표현식을 비교해봤을 때의 장점은  제너레이터표현식이 더 간결히 표현이 가능하다.

그런데 식이 복잡해지면 이 장점을 잃어버리니 상황별로 함수나 표현식을 적절히 쓰는 것이 좋다.

반응형
Comments