-
[python] 제너레이터(Generators) 함수 & 표현식코딩 연습/코딩배우기 2020. 8. 21. 21:24
■ 파이썬의 제너레이터(generator)로 생성된 객체는 iterator 객체이며, next() 함수를 호출하여 값을 하나씩 추출한다.
'yield'가 하나라도 있으면 제너레이터가 되고, yield는 return 역할을 한다.
제너레이터 사용 시 장점은 메모리 공간의 효율성에 있다. 즉, 제너레이터 객체는 반환값을 미리 만들어서 저장해 두지 않는다.
def gen_num(): # 제너레이터 함수 정의 print('first number') yield 1 print('second number') yield 2 print('third number') yield 3 g = gen_num() # 제너레이터 객체 생성, 한 문장도 실행 안됨 print(type(g)) # <class 'generator'> # next() 호출 시 yield 부분까지 실행 (여러 개 있을 경우, 해당 순서까지 실행) print(next(g)) # first number / 1 print(next(g)) # second number / 2 print(next(g)) # third number / 3 #print(next(g)) # StopIteration # 제너레이터 함수 내 for문 사용 def gpow(s): for i in s: yield i ** 2 lst = [2, 5, 9] st = gpow(lst) print(st) # <generator object gpow at 0x000001DA24658B30> print(next(st)) # 4 print(next(st)) # 25 print(next(st)) # 81 #print(next(st)) # StopIteration for i in st: print(i) # iterator 객체에 대해 for문 사용 (전체 출력됨) # 4 # 25 # 81 # 제너레이터 함수 내 for 문 대신 yield from 사용 (파이썬 3.3 이상) def gpow2(s): yield from s lst2 = [3, 6, 9] st2 = gpow2(lst2) print(next(st2)) # 3 print(next(st2)) # 6 print(next(st2)) # 9 #print(next(st2)) # StopIteration # 제너레이터 표현식(제너레이터 객체 생성 방법) - 리스트 컴프리헨션과 유사 lst_c = [2 * i for i in range(1, 10)] # 리스트 컴프리헨션 print(lst_c) # [2, 4, 6, 8, 10, 12, 14, 16, 18] gen_c = (2 * i for i in range(1, 10)) # 제너레이터 표현식 print(gen_c) # <generator object <genexpr> at 0x000001DA2467AE40> for i in gen_c: print(i, end=' ') # 2 4 6 8 10 12 14 16 18 tp_c = tuple(2 * i for i in range(1, 10)) # 튜플 컴프리헨션 print(tp_c) # (2, 4, 6, 8, 10, 12, 14, 16, 18) # 제너레이터 표현식의 기호는 () 로 표시 # 튜플 컴프리헨션은 앞에 tuple이라 붙인다. tuple()
[참고 자료] 윤성우의 열혈 파이썬 중급편
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
[python] 주사위 게임 (0) 2020.08.23 [python] 패킹(packing), 언패킹(unpacking) 그리고 가변인자 (0) 2020.08.23 [python] 소수(素數, prime number) 구하기 (0) 2020.08.21 [python] 리스트 컴프리헨션(List Comprehension) & 이터러블(iterable) 객체 (0) 2020.08.21 [python] n부터 시작하여 m까지 연속하는 숫자의 합은? (0) 2020.08.20