🐍Python | Django

[Python] iterable? iterator?

이줭 2022. 5. 8. 20:28
728x90

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/  

https://itholic.github.io/python-iterable-iterator/

728x90

'🐍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