출처 : 윤성우의 열혈 파이썬 : 중급
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 객체가 올 수 있다
'프로그래머 > Python' 카테고리의 다른 글
[윤성우의 열혈 파이썬 중급편] 07. map & filter (0) | 2020.12.15 |
---|---|
[윤성우의 열혈 파이썬 중급편] 06. 객체처럼 다뤄지는 함수 그리고 람다 (0) | 2020.12.15 |
[윤성우의 열혈 파이썬 중급편] 04. list comprehension (0) | 2020.12.15 |
[윤성우의 열혈 파이썬 중급편] 03. 깊은 복사와 얕은 복사 (0) | 2020.12.15 |
[윤성우의 열혈 파이썬 중급편] 02. 수정 가능한 객체와 수정 불가능한 객체 (0) | 2020.12.15 |