iterable? iterator?
iterable의 의미는 요소를 하나씩 차례로 반환 가능한 object를 뜻한다. iterable의 예로는 sequence type인 list, str, tuple 등이 있고, non-sequence type인 dict나 file도 iterable 하다고 말할 수 있다. (for문을 통해 순차 접근 가능)
또한, __iter__() 나 __getitem__() 메서드를 포함하는 class는 모두 iterable하다고 말할 수 있다.
iterator 객체는 __next__() 메서드로 iterable한 객체의 데이터에 순차적으로 접근할 수 있다. 만약 __next__()로 다음 데이터를 불러올 수 없을 경우 StopIteration exception을 발생시킨다. 그렇다면 iterable한 object들은 모두 iterator인가?
답은 "아니다" 이다. list는 iterable이지만 __next__() 메서드로 호출해도 동작하지 않는다. 만약 iterable을 iterator로 변환하고 싶다면, iter() 메서드를 사용하면 된다. 우리가 list, tuple 같은 객체를 for문에서 사용할 때, python 내부에서 임시로 iterable object를 iterator로 자동 변환해준다.
a = [1, 2, 3, 4]
iterator = iter(a)
print(next(iterator)) # 1
print(next(iterator)) # 2
print(next(iterator)) # 3
print(next(iterator)) # 4
print(next(iterator)) # StopIteration Exception!
객체가 iterable 한지 확인하려면 어떤 객체가 iter() 메서드를 통해 iterator 객체를 생성할 수 있다면, iterable 객체이다.
def is_iterable(obj):
try:
iter(obj)
return True
except TypeError:
return False
items = [34, [4, 5], (1, 2), {'a': 2}, 'string', 4.123]
for item in items:
print(item + 'is iterable: ', is_iterable(item))
# 34 is iterable: False
# [4, 5] is iterable: True
# (1, 2) is iterable: True
# {'a': 2} is iterable: True
# string is iterable: True
# 4.123 is iterable: False
※ iterable한 객체와 sequence 객체의 차이점은 무엇일까?
sqeuence 객체는 __len__(), __getitem__() 메서드를 가지고 있고, int 타입의 인덱스를 통해 원소에 접근할 수 있는 객체들로, list, tuple, str 등이 여기에 속한다. 예를 들어 dictionary 타입의 경우 iterable한 객체이지만 sequence 객체는 아니다.
참고 : https://codechacha.com/ko/python-difference-between-iterator-and-iterable/
'🐍Python | Django' 카테고리의 다른 글
[Django] QuerySet?! (0) | 2022.05.12 |
---|---|
[Python] generator (0) | 2022.05.09 |
[Python] GIL (0) | 2022.05.07 |
[Python] Python의 메모리 관리 (0) | 2022.05.03 |
[Django] Django MTV (0) | 2022.04.29 |