TIL55. generator

Jaeyeon·2021년 3월 20일
0
post-thumbnail

generator란?

  • 제너레이터 객체는 모든 값을 메모리에 올려두고 이용하는 것이 아니라 필요할 때마다 생성해서 반환하는 일을 한다.
  • 이 때문에 메모리를 효율적으로 사용할 수 있다는 장점이 있다.
my_generator = (x for x in range(1,4))

for n in my_generator:
    print(n)

여기서 print(type(my_generator))을 해보면
<class 'generator'>
이런식으로 제너레이터가 나오게 된다.

반복자와 동일한 일을 하는 것처럼 보이지만 여기에서 생성된 1,2,3을 미리 메모리에 만들어 두는 것이 아니라 for문에서 필요로 할 때마다 my_generator로 부터 받아오면 메모리에서 보관하지 않는다는 점이다.
( = lazy evaluation 계산 결과 값이 필요할 때까지 계산을 늦추는 효과가 있음 )

generator의 짝꿍 yield

  • 일반적인 함수의 return문과 유사하지만 yield문은 제너레이터를 반환한다는 점에서 return문과 차이가 있다.

제너레이터를 사용할 때 주의사항

  • 제너레이터는 실행될 때 함수의 몸체를 실행하는 것이 아니라,
    제너레이터 함수가 가진 객체를 반환하는 일을 한다.
  • 제너레이터는 한번 생성해서 반환한 객체를 보관하지 않기 때문에
    이전의 코드를 실행한 후 추가한 코드를 실행하면 아무런 객체도 출력되지 않는다.

왜 제너레이터를 사용하지?

  • 메모리 절약
  • 수행시간 절약
  • 100만개의 피보나치 수열을 출력하고 싶은 경우 효과적

제너레이터를 사용하여 숫자를 출력하는 for문 만들기

def numbers():				# 2 numbers 함수 선언
  for num in range(1, 11):		# 3 1부터 10까지 for문 실행
      if num % 2 == 1:			# 4 만약 num이 홀수이면
          yield num			# 5 yield 키워드를 만나고 값을 반환
for i in numbers():			# 1 for문을 실행하기 위해 numbers() 제너레이터 호출
  print(i, end = " ")			# 6 yield 키워드에서 만난 값을 반환

결과값: 1 3 5 7 9

제너레이터 표현식

제너레이터 표현식은 이터레이터를 반환한다.
제너레이터 함수를 좀 더 쉽게 사용할 수 있도록 해준다.
리스트 컴프리헨션과 구성이 비슷하지만 대괄호가 아닌 소괄호 ()를 사용한다.

(표현식 for 원소 in 반복 가능한 객체)
(표현식 for 원소 in 반복 가능한 객체 if 조건문)
profile
생각하는 개발자 되기

0개의 댓글