ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Generator
    Engineering WIKI/Python 2022. 5. 30. 17:17
    • 파이썬 반복형 종류
    • 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
Designed by Tistory.