728x90

파이썬에서 데이터를 다루는 데에 있어  Iterable, Iterator, Generator는 중요한 개념 중 하나임

이들을 적절히 활용하면 메모리를 효율적으로 활용하고, 코드를 간결하게 작성할 수 있음

1. Iterable(이터러블) 객체

이터러블(Iterable) 객체는 파이썬에서 하나씩 값을 반환할 수 있는 객체

리스트, 튜플, 문자열 등 파이썬에서 제공하는 대부분의 데이터 구조는 이터러블함

  • 이터러블 객체의 특징
    • for 문과 같은 반복문에서 사용 가능
    • zip, map과 같은 함수에서도 사용 가능

2. Iterator(이터레이터) 객체

이터레이터(Iterator)는 이터러블 객체에서 값을 하나씩 가져오는 객체

이터레이터는 iter() 함수로 생성되며, __next__() 메서드 또는 내장 함수 next()를 사용하여 다음 값을 가져옴

  • 이터레이터의 특징
    • 필요한 값만 생성하여 반환하므로 메모리 효율적
    • 모든 원소를 다 반환한 후에는 StopIteration 예외가 발생
  • 이터레이터를 사용하면 효율적인 경우
    • 대용량 데이터 처리: 대용량의 데이터를 처리해야 할 때 이터레이터를 사용하면 필요한 값만 메모리에 로드하여 효율적으로 처리함
    • 순차적인 데이터 접근: 데이터를 순차적으로 접근해야 할 때 이터레이터를 사용하여 데이터를 하나씩 처리 가능
    • 데이터 순회: 데이터를 반복적으로 순회하면서 각각의 요소에 접근해야 할 때 유용

3. Generator(제너레이터)

제너레이터(Generator)는 값을 생성해 주는 함수

yield 키워드를 사용하여 값을 반환하면서 함수의 실행 상태를 유지

  • 제너레이터의 특징
    • 코드가 간결해지며, 상태를 유지하면서 값을 생성 가능
    • 메모리 사용량이 적음
    • 무한한 시퀀스를 생성 가능
  • 제너레이터를 사용하면 효율적인 경우
    • 대용량 데이터 생성: 대용량의 데이터를 생성해야 할 때 제너레이터를 사용하여 필요한 값만 생성할 수 있음
    • 지연 평가(Lazy Evaluation)가 필요한 경우: 값이 필요한 시점까지 연산을 미루고 싶을 때 제너레이터를 사용하여 지연 평가를 구현할 수 있음
    • 무한한 시퀀스 생성: 무한한 시퀀스를 생성해야 할 때 제너레이터를 사용하여 끝없는 데이터 스트림을 효과적으로 표현할 수 있음

4. 예제

# Iterable 객체 사용한 예제
for element in iterable_object:
    print(element)

# Iterable과 Iterator를 함께 사용한 예제
iterator_object = iter(iterable_object)
while True:
    try:
        element = next(iterator_object)
        print(element)
    except StopIteration:
        break

# Iterator를 사용한 예제
class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        value = self.data[self.index]
        self.index += 1
        return value

my_list = [1, 2, 3, 4, 5]
my_iterator = MyIterator(my_list)
for item in my_iterator:
    print(item)

# Generator를 사용한 예제
def generator_square(end):
    for number in range(0, end):
        yield number**2

square_results = generator_square(999999)
for result in square_results:
    print(result)
728x90

'Python' 카테고리의 다른 글

파이썬 매직 메서드  (0) 2024.03.29
파이썬 공부할 책 모음  (0) 2024.03.28
pydantic_settings를 이용한 환경설정  (0) 2024.03.16
RuntimeError: Failed to lock Pipfile.lock!  (0) 2024.03.05
alembic 소개 및 기초 사용법  (0) 2024.03.05

+ Recent posts