Python 심화22 - 제너레이터

do yeon kim·2022년 6월 8일
0

Python(심화)_fastcampus

목록 보기
23/24

제너레이터

제너레이터란?
이터레이터를 만드는 함수.
함수에서 yield(생산하다)를 사용하면 된다.

제너레이터 3가지 특징

  • 함수안에 yield를 사용한다.(return과 비교)
  • 제너레이터 표현식을 사용할 수있다. 리스트내포랑 비슷하다.
  • 메모리 사용이 효율적이다.

#제너레이터

#1.이터레이터를 만드는 함수

def Month_generator(*args):
    for arg in args:
        yield arg 

g = Month_generator("1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월")

# 제너레이터에서 가변인자를 받는다.
# for문에서 하나씩 arg로 들어온다.
# yield한다
# 해당되는 arg 값을 밖으로 리턴을 해주고 함수 실행을 지연시킨다..



#제너레이터 객체
#제너레이터는 이터레이터에 포함되어있다.
# print(g) #<generator object Month_generator at 0x000001BCD7E203C0> 

print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())

12345656789101112def func():
    print("첫번쨰 작업중...")
    yield 1

    print("두번쨰 작업중...")
    yield 2

    print("세번쨰 작업중...")
    yield 3

#제너레이터를 할당할 변수를 생성
ge = func()
data = ge.__next__()
print(data)
print()
data = ge.__next__()
print(data)
print()
data = ge.__next__()
print(data)

첫번쨰 작업중...
1

두번쨰 작업중...
2

세번쨰 작업중...
3



#yield를 만나기 전까지 쭉 실행된다.
#yield를 만나면 yield가 반환하는 값을 받아온다.

#return은 작업도중 return을 만나면 바로 함수실행이 종료가 되고
#결과값이 반환된다.
#반면 yield은 첫번쨰 작업, 두번째 작업, 세번째 작업을 나누어서 관리 할수있다는 장점이 있다.


def func():
    print("첫번쨰 작업중...")
    return 5

    # print("두번쨰 작업중...")
    # yield 2

    # print("세번쨰 작업중...")
    # yield 3

ge = func

print(ge())





#2.제너레이터 표현식
#리스트내포방식
list = [i*2 for i in range(1,10)] #[ ]

#제너레이터 표현식
double_generator = (i*2 for i in range(1,10)) #( )

#제너레이터는 이터레이터 이기때문에 for문에서 사용할수 있다. 
#print(double_generator)  #<generator object <genexpr> at 0x00000183C55E03C0>

for i in double_generator:
    print(i)

2
4
6
8
10
12
14
16
18

#함수를 만들지 않고 간단하게 제너레이터를 만들 수 있다.





#3.메모리 사용을 효율적으로 하기 위해서 사용
# 리스트 : 데이터 저장에 필요한 메모리를 모두사용
# 제너레이터 : 나중에 필요할때 값을 만들어 사용(메모리 적게 필요)

list_data = [i*3 for i in range(1,10000 +1)]
generator_data = (i*3 for i in range(1,10000 +1))

#객체가 얼마나 데이터를 잡아먹는지 확인
import sys

print(sys.getsizeof(list_data)) #85176
print(sys.getsizeof(generator_data)) #104

#리스트데이터는 이미 결과값을 계산해서 메모리상에 올려놓았다.
#제너레이터는 식만 만들고 결과값을 저장하지 않고, __next__()메서드가 호출될때마다 결과값을 만들기 때문에

#대용량 데이터를 사용시는 제너레이터가 더 좋다.

https://fastcampus.co.kr/dev_online_pyweb

0개의 댓글