본문 바로가기
Engineering WIKI/Python

Generator

by wonos 2022. 5. 30.
  • 파이썬 반복형 종류
  • Iter, next 함수
  • Generator 장점
  • Generator 코딩 실습
  • Generator 내장 함수 실습

  • 반복 가능한 이유 ? ⇒ iter(x) 함수 호출
  • Generator 패턴
    • 지능형 리스트, 딕셔너리, 집합 → 데이터 셋이 증가 될 경우 메모리 사용량 증가 → 제너레이터 완화
    • 단위 실행 가능한 코루틴(Coroutine) 구현에 아주 중요
    • 딕셔너리, 리스트 한 번 호출 할 때 마다 하나의 값만 리턴 → 아주 작은 메모리 양을 필요로 함

  • Generator 예제 1
def generator_ex1():
	print('start')
	yield 'AAA'
	print('continue')
	yield 'BBB'
	print('end')

temp = iter(generator_ex1())

print('EX4-1 -', next(temp))
# start
# EX4-1 - AAA
print('EX4-2 -', next(temp))
# continue
# EX4-1 - BBB
print('EX4-3 -', next(temp))
# end
# 예외 StopIteration

# Generator 예제2

temp2 = [x * 3 for x in generator_ex1()]
temp3 = (x * 3 for x in generator_ex1())

print('EX5-1 -', temp2)
# ['AAAAAAAAA', 'BBBBBBBBB']
print('EX5-2 -', temp3)
# <generator object ~ >

for i in temp2:
	print('EX5-3 -', i)
	# AAAAAAAAA
	# BBBBBBBBB
for i in temp3:
	print('EX5-4 -', I)
	#start
	#AAAAAAAAA

# Generator 예제3 (자주 사용하는 함수)
import itertools

gen1 = itertools.count(1, 2.5)

print('EX6-1 -', next(gen1))
# 1
print('EX6-2 -', next(gen1))
# 3.5
print('EX6-3 -', next(gen1))
# 6
print('EX6-4 -', next(gen1))
# 8.5

# 조건
gen2 = itertools.takewhile(lambda n : n < 1000, itertools.count(1, 2.5))

for v in gen2:
	print('ex6-5 -', v)
	# 1 ~ 998.5 까지 print 찍힘

# 필터 반대
gen3 = itertools.filterfalse(lambda n : n < 3, [1,2,3,4,5])_

for v in gen3:
	print('EX6-6 -', v)
	# 3
	# 4
	# 5

# 누적 합계
gen4 = itertools.accumulate([x for x in range(1, 101)])

for v in gen4:
	print('EX6-7 -', V)
	# 1
	# 3 => (누적합 : 1+2)
 	# 6 => (누적합 : 1+2+3)

# 연결 1
gen5 = itertools.chain('ABCDE', range(1, 11, 2))

print(list(gen5))
#['A', 'B', 'C', 'D', 'E', 1, 3, 5, 7, 9]

# 연결 2
gen6 = itertools.chain(enumerate('ABCDE')

print(list(gen6))
#[(0, 'A'), (1, 'B'), (2, 'C'), (3, 'D'), (4, 'E')]

# 연산
gen8 = itertools.product('ABCDE', repeat=2)

print(list(gen8)) # 곱연산, 모든경우의 수를 제공함.

# 그룹화
gen9 = itertools.groupby('AAABBBCCDDEEEE')

for chr, group in gen9:
	print(chrk, ':', list(group))
	# ['A', 'A', 'A']
	# ['B', 'B', 'B']
	# ['C', 'C']
	# ~~~~~

 

코루틴

  • yield : 메인루틴 ↔ 서브루틴
  • 코루틴 제어, 코루틴 상태, 양방향 값 전송
  • yield from
  • 서브루틴 : 메인루틴에서 → 리턴에 의해 호출 부분으로 돌아와 다시 프로세스
  • 코루틴 : 루틴 실행 중 멈춤 가능 → 특정 위치로 돌아갔다가 → 다시 원래 위치로 돌아와 수행 가능
  • GEN_CREATED : 처음 대기 상태
  • GEN_RUNNING : 실행 상태
  • GEN_SUSPENDED : yield 대기 상태
  • GEN_CLOSED : 실행 완료 상태

'Engineering WIKI > Python' 카테고리의 다른 글

일급함수  (1) 2022.05.30
파이썬 2진수, 8진수, 10진수, 16진수 변환  (0) 2022.05.26
추상클래스(abstract class)  (1) 2022.05.25
파이썬 람다식  (0) 2022.05.25
파이썬 퀵 정렬  (0) 2022.05.25
Python3 vs Pypy3  (0) 2022.05.25
Python TDD  (0) 2022.05.23
파이썬 상속 (Inheritance)  (0) 2022.05.23