파이썬에서의 생성자(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
가 발생한다.
결론
- 생성자는
yield
와yield from
을 활용해 간단히 정의할 수 있으며, 이터러블을 반복하는 데 유리하다. close()
메서드는 예외 처리 시 반드시finally
블록에서 호출해야 하며, 생성자는 복제 불가능한 특성을 주의해야 한다.- 실무에서는
generator comprehension
과yield from
을 사용해 코드를 간결하게 작성할 수 있다.