본문 바로가기

프로그래머/Python

[윤성우의 열혈 파이썬 중급편] 05. Iterable 객체와 Iterator 객체

출처 : 윤성우의 열혈 파이썬 : 중급

05. Iterable 객체와 Iterator 객체

iter 함수

ds = [1, 2, 3, 4]
for i in ds:
    print(i, end = ' ')

ir = iter(ds)
next(ir)    # 1
next(ir)    # 2
next(ir)    # 3
next(ir)    # 4
next(ir)    # StopIteration error
  • iter 함수는 리스트에서 값을 꺼내는 기능을 제공하는 객체를 생성해서 반환
  • 꺼내는 방법과 꺼낸 값을 처리하는 방법에 있어서도 유연성이 생긴다

Iterable 객체와 Iterator 객체의 구분

  • iterable 객체를 대상으로 iter 함수를 호출해서 iterator 객체를 만든다
  • iterator 객체를 생성할 수 있는 대상이 되는 것이 iterable 객체이다

special method

ds = [1,2,3]
ir = iter(ds)
next(ir)

ir = ds.__iter__()
ir__next__()
  • 리스트의 __ iter __ 메소드 호출을 통해서 iterator 객체를 얻게 된다
  • iterator 객체의 __ next __ 메소드 호출을 통해서 값을 하나씩 얻게 된다
  • special method : 파이썬 인터프리터에 의해서 호출되는 메소드

iterable 객체의 종류와 확인 방법

dir([1, 2])                     # ['__add__', '__class__', ...]
hasattr([1, 2], '__iter__')     # True

for 루프와 iterable 객체

for i in [1, 2, 3]:
    print(i, end = ' ')

# 내부적으로 다음과 같이 동작
ir = iter([1, 2, 3])
while True:
    try:
        i = next(ir)
        print(i, end = ' ')
    except StopIteration:
        break

ir = iter([1, 2, 3])
for i in ir:
    print(i, end = ' ')

ir1 = iter([1, 2, 3])
ir2 = iter(ir1)
ir1 is ir2  # True
id(ir1)
id(ir2)     # 동일하다
  • for 루프의 반복 대상은 반드시 iterable 객체이어야 한다
  • for 루프에 iterable 객체가 아닌 iterator 객체를 두어도 정상적으로 동작한다
  • iter 함수에 iterator 객체를 전달하면 전달된 iterator 객체를 그대로 되돌려주기 때문이다

iterable 객체와 iterator 객체 모두 for 루프의 반복 대상이 될 수 있다
iterable 객체가 와야 하는 위치에는 iterator 객체가 올 수 있다