초보 개발자

10강 제너레이터 표현식 본문

Python/윤성우 열혈 파이썬

10강 제너레이터 표현식

taehyeki 2021. 12. 16. 16:35

앞서 제너레이터 객체를 생성하는 방법에 2가지가 있다고 하였고 제너레이터 함수를 사용하여 생성하는 방법을 포스팅하였는데 이번에는 제너레이터 표현식에 대해서 설명해보려고 한다.

 

st = [2*i for i in range(1,10)] #구구단 2단을 전부 저장한 리스트 생성
st = (2*i for i in range(1,10)) 2단을 반환하는 제너레이터 생성

( ) 소괄호 안에 저렇게 적어주면 간단하게 제너레이터 표현식이 완성된다. [] 로 감싸주면 리스트 컴프리헨션이지만

( )로 감싸주면 제너레이터 표현식이 된다. 튜플 컴프리헨션이 아닐까..? 하는 의심이 들지만 제너레이터 표현식이다.

 

next(st)를 하면 2가 출력이 되고 그다음

next(st)를 하면 4 ....

마지막에는 18 

그 이후에는 StopIteration이 출력이 된다.

 

이걸 함수식으로 만들면 아래와 같다.

def time2()
	for i in range(1,10):
    	yield 2 * i
        
g = time2() # 제너레이터 객체의 생성
show_all(g) # for 루프로 print 하는 함수이다.
2 4 6 8 10 12 14 16 18

 

def two()
	print('two') # two 함수 호출 시에 two라는 문자열 출력
    return 2
   
g = (two() * i for i in range(1,10)) # 이때 two 함수 호출 안됨
next(g) 
two
2
next(g)
two
4

이 예제를 만들기 위해서 next 함수 호출 시마다 문자열 two가 하나씩 출력되었다는 것은 next함수가 호출 되는 순간!!에 던져줄 값이 만들어진 증거로 볼 수 있다. 만약 리스트 컴프리헨션이었다면 two가 10번이 호출이 되었을 것이지만 제너레이터 표현식 ( ( )로 감쌈 )이기 때문에 미리 만들어 진 것이 아니고 next를 호출 했을 경우에만 two가 호출이 된 것을 볼 수 있다.

( two() * i ) 연산이 next를 누를 때마다 실행이 되었음

 

[제너레이터 표현식을 직접 전달하기]

def show_all(s):
	for i in s:
    	print(i, end = ' ')
        
        
show_all((2 * i for i in range(1,10))) # 제너레이터 표현식을 직접 전달
2 4 6 8 10 12 14 16 18

전에는 show_all( st ) 이런식으로 st를 따로 제네레이터 객체에 참조시킨다음에 그 변수를 집어 넣었다면

이번에는 한번에 집어 넣은 것이다. 이렇게 바로 전달할 수도 있다.

 

이 경우 소괄호가 두 번 겹쳐져서 보기 불편하다. 그래서 이렇듯 함수에 제너레이터 표현식을 바로 전달할 경우에는 다음과 같이 소괄호를 생략할 수 있다. -> 함수를 호출하는 소괄호를 생략할 수 있다.

show_all(2*i for i in range(1,10)) # 위에서 정의한 show_all 호출
2 4 6 8 10 12 14 16 18

전달 인자에 제너레이터 표현식이 왔으니까 소괄호가 생략이 되었구나 라고 생각을 하자!!

 

'Python > 윤성우 열혈 파이썬' 카테고리의 다른 글

12강 네임드 튜플  (0) 2021.12.22
11강 튜플의 패킹과 언패킹  (0) 2021.12.22
9강 제너레이터 함수  (0) 2021.12.16
8강 map과 filter를 대신하는 리스트 컴프리헨션  (0) 2021.12.16
7강 map & filter  (0) 2021.12.16