ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 컴프리 헨션의 고려사항
    @ 17. 1 ~ 18/파이썬 2018. 3. 15. 23:55

    리스트 컴프리헨션의 문제점은 입력 시퀀스에 있는 가 값별로 아이템을 하나씩 담은 새 리스트를 통째로 생성한다는 점이다.

    입력이 적을 때는 괜찮지만 클때는 메모리를 많이 소모해서 프로그램을 망가뜨리는 원인이 되기도 한다.


    파이썬은 이 문제를 해결하려고 리스트 컴프리헨션과 제너레이터를 일반화한 제너레이터 표현식을 제공한다.

    제너레이터 표현식은 실행될때 출력 시퀀를 모두 메모리에 로딩하지 않는다. 대신에 표현식에서 한번에 한 아이템을 내주는 이터레이터로 평가된다.


    제너레이터 표현식은 () 문자 사이에 리스트 컴프리헨션과 비슷한 문법을 사용한다.

    value = [len(x) for in open('/tmp/my_file.txt')]

    value = (len(x) for in open('/tmp/my_file.txt'))

    하지만 print(value)했을떄의 결과가 다르다.

    제너레이터 표현식의 경우 즉시 이터레이터로 평가되므로 더는 진행되지 않는다. 

    (위에 리스트 컴프리헨션의 경우 내용이 출력된다)


    제너레이터 표현식에서 다음 출력을 생성하려면 내장 함수 next로 반환받은 이터레이터를 한번에 전진시키면 된다.

    print(next(value)


    결국 큰 입력 스트림에 동작하는 기능을 결합하는 방법을 찾을 때는 제너레이터 표현식이 최선의 도구다.


    enumerate라는 것도 있다. 지연 제너레이터로 불리운다(laze generator). 이터레이터를 감싼다.

    이 제너레이터는 이터레이터에서 루프 인덱스와 다음의 값을 한쌍으로 가져와 넘겨준다.


    flavor_list = ['a','b','c','d','e']

    for i, favor in enumerate(flavor_list):
    print('%d:%s' % (i + 1, favor))


    1:a
    2:b
    3:c
    4:d

    5:e



    '@ 17. 1 ~ 18 > 파이썬' 카테고리의 다른 글

    파이썬 None  (0) 2018.03.18
    try/except/else/finally  (1) 2018.03.18
    문자열 서식  (0) 2018.03.14
    파이썬 리스트 관련  (0) 2018.03.14
    PEP8 스타일 가이드를 따르자  (0) 2018.03.12
Designed by Tistory.