이전 시간에 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