이전 시간에 iter 함수를 호출하면서 리스트 인자를 전달했다.
>>> ds = [1, 2, 3, 4]
>>> ir = iter(ds)  # iterator 객체를 얻는 방법
# iterator 객체를 통해 값을 하나씩 꺼내는 방법
>>> next(ir)  # 첫번째 값 반환
1
>>> next(ir)  # 두번째 값 반환
2
>>> next(ir)  # 세번째 값 반환
3
>>> next(ir)  # 네번째 값 반환
4
그러나 실제로는 리스트 객체 안에 존재하는 __iter__()이름의 메소드를, __next__()이름의 메소드를 간접적인 형태로 호출하는 것이다.
>>> ds = [1, 2, 3, 4]
>>> ir = ds.__iter__()  # iter 함수 호출의 실제 모습
>>> ir.__next__()  # next 함수 호출의 실제 모습
1
>>> ir.__next__()
2
>>> ir.__next__()
3
>>> ir.__next__()
4
여기서 간접적 호출이란 그 이름을 명시해서 호출하는 것이 아니라 다른 경로를 통해서 그 메소드의 호출을 유도하는 것이며,
이러한 형태의 메소드들을 가리켜 스페셜 메소드라 한다.
스페셜 메소드는 우리가 직접 사용하기 위해 만들어진 것은 아니다.
iterable 객체의 종류와 확인 방법우리는 리스트를 통해 iterator 객체를 얻을 수 있었다.
그럼 튜플이나 문자열을 통해서도 iterator 객체를 얻을 수 있을까?
얻을 수 있다!
즉, 튜플과 문자열도 iterable 객체인 것이다.
예제를 통해 확인해보도록 하겠다.
>>> td = ('one', 'two', 'three')
>>> ir = iter(td)
>>> next(ir)
'one'
>>> next(ir)
'two'
>>> next(ir)
'three'
>>> s = 'iteration'
>>> ir = iter(s)
>>> next(ir)
'i'
>>> next(ir)
't'
>>> next(ir)
'e'
그렇다면 iterable객체인지 확인하기 위한 방법은 무엇이 있을까?
✔ dir 함수
첫번째로 dir 함수를 호출해 __iter__ 메소드가 존재하는지 확인해 iterable객체인지 아닌지 판단할 수 있다
>>> dir([1, 2])  # 리스트 객체 안에 있는 것들의 이름을 보아라
✔ hassattr 함수
두번째로 hassattr 함수 호출을 통해서도 판단할 수 있다. hassattr을 사용하면 True, False를 반환해준다
>>> hasattr([1, 2], '__iter__')  # 리스트에 __iter__함수가 있나요?
🔎 참고
중급편 열혈 파이썬 story05