"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Python에서 반복자와 생성기를 사용하는 방법

Python에서 반복자와 생성기를 사용하는 방법

2024-08-22에 게시됨
검색:501

How to Work with Iterators and Generators in Python

Python에서 반복자와 생성기는 데이터 시퀀스 작업을 위한 강력한 도구입니다. 전체 시퀀스를 메모리에 저장하지 않고도 데이터를 반복할 수 있습니다. 이 블로그에서는 실용적인 예제를 통해 반복자와 생성기를 간단하고 이해하기 쉬운 방식으로 설명합니다.

1. 반복자란 무엇입니까?

정의: 반복자는 컬렉션의 모든 요소(예: 목록 또는 튜플)를 한 번에 하나씩 탐색할 수 있는 Python의 개체입니다. 이는 __iter__() 및 __next__()의 두 가지 메서드 구현을 포함하는 반복자 프로토콜을 따릅니다.

반복자의 작동 방식:

  • __iter__(): 이 메서드는 반복자 객체 자체를 반환합니다.

  • __next__(): 이 메서드는 컬렉션에서 다음 값을 반환합니다. 반환할 항목이 더 이상 없으면 StopIteration 예외가 발생합니다.

사용자 정의 반복자의 예:

class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index 



산출:

1
2
3

설명: 이 예에서 MyIterator는 숫자 목록을 반복하는 사용자 정의 반복자 클래스입니다. __next__() 메서드는 목록의 다음 항목을 반환하고 더 이상 반환할 항목이 없으면 StopIteration을 발생시킵니다.

내장 컬렉션의 기본 반복자

Python은 목록, 튜플, 사전 및 세트와 같은 내장 컬렉션에 대한 기본 반복자를 제공합니다. iter 함수를 사용하여 이러한 컬렉션에서 반복자를 가져온 다음 next를 사용하여 컬렉션을 반복할 수 있습니다.

목록의 예:
my_list = [1, 2, 3]
my_iter = iter(my_list)

print(next(my_iter))  # Output: 1
print(next(my_iter))  # Output: 2
print(next(my_iter))  # Output: 3
# print(next(my_iter))  # This will raise StopIteration

2. 생성기란 무엇입니까?

정의: 생성기는 함수와 Yield 키워드를 사용하여 정의되는 Python의 특별한 유형의 반복자입니다. 생성기를 사용하면 한 번에 모든 값을 메모리에 저장하지 않고도 일련의 값을 반복할 수 있으므로 목록보다 메모리 효율성이 더 높습니다.

제너레이터 작동 방식:

  • 항복: 항복 키워드는 값을 생성하고 함수를 일시 중지하여 상태를 저장하는 데 사용됩니다. 생성기가 다시 호출되면 중단된 부분부터 실행이 다시 시작됩니다.

예:

def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
for item in gen:
    print(item)

산출:

1
2
3

설명: 이 예에서 my_generator는 세 개의 값을 하나씩 생성하는 생성기 함수입니다. 각 항복 호출은 값을 생성하고 다음 값이 요청될 때까지 함수를 일시 중지합니다.

3. 생성기 사용의 이점

메모리 효율성: 생성기는 즉시 값을 생성하고 전체 시퀀스를 메모리에 저장하지 않으므로 대규모 데이터 세트 또는 데이터 스트림 작업에 이상적입니다.

예:

def large_sequence():
    for i in range(1, 1000001):
        yield i

gen = large_sequence()
print(next(gen))  # Output: 1
print(next(gen))  # Output: 2

설명: 이 생성기는 메모리에 모두 저장하지 않고 백만 개의 숫자 시퀀스를 생성하여 메모리 효율성을 보여줍니다.

4. 반복자와 생성자의 사용 사례

반복자:

  • 사용자 정의 반복 가능 개체: 반복 논리에 대한 추가 제어가 필요한 경우.

  • 무한 시퀀스: 센서의 데이터와 같은 값의 끝없는 시퀀스를 생성합니다.

생성기:

  • 지연 평가: 대규모 데이터세트를 한 번에 한 항목씩 처리합니다.

  • 파이프라인: 스트리밍 방식으로 데이터를 처리하는 데이터 처리 파이프라인을 구축합니다.

5. 생성기 표현식

정의: 생성기 표현식은 생성기를 생성하는 간결한 방법을 제공합니다. 이는 목록 이해와 유사하지만 대괄호 대신 괄호를 사용합니다.

예:

gen_exp = (x * x for x in range(5))
for value in gen_exp:
    print(value)

산출:

0
1
4
9
16

설명: 이 생성기 표현식은 0에서 4까지 숫자의 제곱을 생성하는 생성기를 생성합니다.

6. 실제 사례 및 모범 사례

예 1: 대용량 파일 읽기

def read_large_file(file_path):
    with open(file_path, 'r') as file:
        for line in file:
            yield line

for line in read_large_file('large_file.txt'):
    print(line.strip())

설명: 이 생성기 함수는 큰 파일을 한 줄씩 읽어 한 번에 한 줄씩 생성합니다. 전체 파일을 메모리에 로드하지 않기 때문에 메모리 효율적입니다.

예 2: 피보나치 수열

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a   b

fib = fibonacci()
for _ in range(10):
    print(next(fib))

산출:

0
1
1
2
3
5
8
13
21
34

설명: 이 생성기 함수는 무한한 피보나치 수열을 생성합니다. 생성기를 사용하여 잠재적으로 무한한 값 시퀀스를 생성하는 방법을 보여줍니다.

7. 면접 질문 및 답변

  1. Python의 반복자는 무엇인가요?
* An iterator is an object that allows you to traverse through all the elements of a collection one at a time, implementing the `__iter__()` and `__next__()` methods.
  1. Python의 생성기란 무엇입니까?
* A generator is a special type of iterator defined using a function and the `yield` keyword, allowing you to generate values on the fly without storing them all in memory.
  1. 생성기를 사용하면 어떤 이점이 있나요?
* Generators are memory-efficient, as they generate values on the fly. They are useful for processing large datasets, building data pipelines, and working with potentially infinite sequences.
  1. 생성기 표현식은 목록 이해와 어떻게 다릅니까?
* Generator expressions use parentheses and produce values one at a time, whereas list comprehensions use square brackets and generate the entire list in memory.
릴리스 선언문 이 기사는 https://dev.to/tapstechie/how-to-work-with-iterators-and-generators-in-python-35k3?1에 복제되어 있습니다. 침해가 있는 경우에는 [email protected]으로 문의해 주세요. 그것을 삭제하려면
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3