ABOUT ME

-

  • [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()

     

    good4me.co.kr

    [참고 자료] 윤성우의 열혈 파이썬 중급편

     

Designed by goodthings4me.