TIL53. Iterable 과 Iterator

Jaeyeon·2021년 3월 20일
0
post-thumbnail

✅ Iterable

  • 해석 그대로 '반복 될 수 있는' 을 의미한다.
  • 대표적으로 iterable한 타입은 list, dic, set, str, bytes, tuple, range가 있다.
  • for in 반복문, ragne, enumerate로 iterable한 타입인지 확인 할 수 있다.

✅ Iterator

Iterator 객체

  • 값을 차례대로 꺼낼 수 있는 객체를 의미한다.
  • Iterator 객체 인지 아닌지는 파이썬 내장함수인 iter()을 사용하면 확인 할 수 있다.

변수가 iterable 하지 않은 정수일 때

a = 123
print(iter(a))

결과값: TypeError: 'int' object is not iterable

변수가 iterable한 str일 때

a = '123'
print(iter(a))

결과값: <str_iterator object at 0x7fc73d6251f0>

매직메소드 __iter__

  • 이터러블 객체 자신을 반환한다.
  • iterable한 객체는 매직메소드 __iter__ 를 가지고 있다.
  • 파이썬 내장함수인 dir()를 이용하여 살펴보자
>> b = {1, 2, 3}
>> dir(b)
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
>>c = `b.__iter__()`
>>type(c)
<class 'set_iterator'>

next 함수

a = [5,6,7,8]
a_iter = iter(a)
print(next(a_iter))
print(next(a_iter))
print(next(a_iter))
print(next(a_iter))
print(next(a_iter))

결과값:
5
6
7
8
Traceback (most recent call last):
File "/Users/pro16/PycharmProjects/pycharm_test/hi.py", line 7, in
print(next(a_iter))
StopIteration
5,6,7,8 까지 출력하다가 리스트 안의 객체가 더이상 없어서 Error 발생

매직메소드 __next__

  • 다음 반복을 위한 값을 반환한다.
  • iterator 매직 메소드인 next를 이용하여 똑같이 구현할 수 있다.
a = [5,6,7,8]
a_iter = iter(a)
print(a_iter.__next__())
print(a_iter.__next__())
print(a_iter.__next__())
print(a_iter.__next__())
print(a_iter.__next__())

결과값:
5
6
7
8
Traceback (most recent call last):
File "/Users/pro16/PycharmProjects/pycharm_test/hi.py", line 7, in <module>
print(a_iter.__next__())
StopIteration

profile
생각하는 개발자 되기

0개의 댓글