TIL_Iterable, Iterator
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로 인스턴스를 만들 때 반복문을 사용하지 않고도 순환하는 객체를 만들 수 있게 되었다.
Author And Source
이 문제에 관하여(TIL_Iterable, Iterator), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@riassuc/TILIterator저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)