파이썬에서의 생성자(Generator)와 반복자(Iterator) 이해

프로그래밍/소프트웨어 개발

개발 툴

대상자: 파이썬 초보자 및 중급자

  • 난이도: 중급 (yield, generator comprehension, 예외 처리 등 기초 개념 이해 필요)

핵심 요약

  • 생성자(generator)yield 또는 yield from 문을 사용하여 정의된 함수로, 반복 가능한 객체를 생성한다.
  • generator comprehension을 통해 간단히 생성자 객체를 만들 수 있으며, next()로 요소를 순차적으로 접근할 수 있다.
  • 생성자는 복제 불가능이며, close() 메서드로 강제 종료할 수 있고, 예외 처리 시 finally 블록에서 호출해야 한다.

섹션별 세부 요약

1. 생성자의 정의 및 기본 동작

  • yield 문을 사용한 함수는 생성자로, next() 호출 시 yield 지점에서 일시 중단되며, StopIteration 예외로 종료된다.
  • 예:

```python

def func():

yield 'a'

yield 'b'

```

  • 생성자는 type(gen)으로 로 확인 가능하다.

2. `yield from`의 활용

  • yield from은 이터러블(예: 리스트)의 요소를 순차적으로 yield하는 기능을 제공한다.
  • 예:

```python

def func():

yield from ['a', 'b', 'c']

```

  • 이는 중첩된 이터러블을 편리하게 처리할 수 있다.

3. 생성자와 `for` 문의 연동

  • for 문 내부에서 yield를 사용하면, 반복자로 동작하며 next() 호출 시 순차적으로 요소를 반환한다.
  • 예:

```python

def func():

for x in ['a', 'b', 'c']:

yield x

```

4. 생성자 컴프리헨션

  • (x.upper() for x in ['a', 'b', 'c']) 형태로 간단히 생성자 객체를 만들 수 있다.
  • next()로 요소를 접근하며, 컴프리헨션은 generator 객체로 생성된다.

5. `close()` 메서드와 예외 처리

  • close()는 생성자를 강제 종료하며, StopIteration 예외를 발생시킨다.
  • 예외 처리 시 finally 블록에서 close()를 호출하여 리소스 누수를 방지해야 한다.
  • 예:

```python

try:

gen = func()

print(next(gen))

finally:

gen.close()

```

6. 생성자의 복제 불가능성

  • copy() 또는 deepcopy()로 생성자 객체를 복제할 수 없으며, 복제 시 AttributeError가 발생한다.

결론

  • 생성자는 yieldyield from을 활용해 간단히 정의할 수 있으며, 이터러블을 반복하는 데 유리하다.
  • close() 메서드는 예외 처리 시 반드시 finally 블록에서 호출해야 하며, 생성자는 복제 불가능한 특성을 주의해야 한다.
  • 실무에서는 generator comprehensionyield from을 사용해 코드를 간결하게 작성할 수 있다.