TIL_Iterable, Iterator

9509 단어 pythonpython

Iterator 객체를 공부하는데 Iterable 객체와 Iterator 객체 이 두가지가 비슷한 거 같아서 이해가 잘 안되어 알아보았다.

1. Iterable 객체

1-1. Iterable 객체란?

__iter__라는 스페셜 메소드(a.k.a 매직 메소드)를 가진 객체(문자열, 리스트, 튜플, 딕셔너리 등)
Iterable 객체로 Iterator 객체를 리턴할 수 있다.

1-2. Iterable 객체인지 확인하는 방법

aa = [1, 2, 3]
dir(aa)
['__add__', '__class__', '__class_getitem__',
'__contains__', '__delattr__', '__delitem__',
'__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__getitem__',
'__gt__', '__hash__', '__iadd__', '__imul__',
'__init__', '__init_subclass__', '__iter__', # 여기
'__le__', '__len__', '__lt__', '__mul__',
'__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__reversed__',
'__rmul__', '__setattr__', '__setitem__',
'__sizeof__', '__str__', '__subclasshook__',
'append', 'clear', 'copy', 'count', 'extend',
'index', 'insert', 'pop', 'remove', 'reverse',
'sort']

내장함수 dir()을 사용해서 스페셜 메소드 __iter__를 확인 할 수 있다
간단하게 for i in '여기': for in 문을 사용할 때 '여기'에 넣고 에러 없이 반복이 가능하면 Iterable 객체이다

2. Iterator 객체

2-1. Iterator 객체란?

순차적으로 다음 데이터를 리턴 할 수 있는 객체
스페셜 메소드 __next__를 가지고 있다.
순차적으로 다음 데이터를 리턴하다가 다음 데이터가 없으면 StopIteration 예외를 발생시킨다.

2-2. Iterator 객체 생성, 사용

Iterable 객체에 내장함수 iter()를 사용해서 만들 수 있다.

aa = [1, 2, 3]
aa_iterator = iter(aa) # aa_iterator라는 iterator객체 생성

type(aa_iterator) # 실행결과 <class 'list_iterator'>

객체 생성 후에 내장함수 next()나 스페셜 메소드 __next__를 사용해서 내부 데이터를 순차적으로 리턴 할 수 있다.

# next() 사용
next(aa_iterator) # 실행결과  1
next(aa_iterator) # 실행결과  2
next(aa_iterator) # 실행결과  3

# __next__ 사용
aa_iterator.__next__() # 실행결과 1
aa_iterator.__next__() # 실행결과 2
aa_iterator.__next__() # 실행결과 3

이 두가지는 사용법만 다르고 사용 결과는 같다.

next(aa_iterator) # 실행결과  1
next(aa_iterator) # 실행결과  2
next(aa_iterator) # 실행결과  3
next(aa_iterator)
# 실행결과 Traceback (most recent call last):
#  File "<pyshell#161>", line 1, in <module>
#    next(aa_iterator)
# StopIteration

내부 데이터를 다 순환하고 나면 StopIteration 예외를 발생시킨다.

for 문을 사용하면 파이썬이 매번 next() 함수로 Iterator, Iterable 객체의 다음 값을 읽어내는 것이다.

3. 마무리

Iterable 객체Iterator 객체를 처음 봤을 때는 둘 다 뭔가 순차적으로 순회하고 말도 비슷해서 상위, 하위 개념이나 종속적인 관계인 줄 알았는데 그게 아니었다. 반복문처럼 순차적으로 순환할 수 있다는건 굉장히 유용한 특성인 것 같다. 그 전까지는 뭔가 순차적으로 돌리는건 반복문의 전유물인 줄 알았는데, 이 두 객체로 인해서 Class로 인스턴스를 만들 때 반복문을 사용하지 않고도 순환하는 객체를 만들 수 있게 되었다.


좋은 웹페이지 즐겨찾기