일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- NEXT
- tensorflow
- c++
- lazy propagation
- 문자열
- Overfitting
- object detection
- DP
- 다익스트라
- 회고록
- 세그먼트 트리
- 크루스칼
- 우선 순위 큐
- back propagation
- dfs
- 가끔은 말로
- 가끔은_말로
- 조합론
- pytorch
- 2023
- 플로이드 와샬
- 너비 우선 탐색
- BFS
- 백트래킹
- 미래는_현재와_과거로
- 분할 정복
- dropout
- 알고리즘
- 자바스크립트
- 이분 탐색
- Today
- Total
Doby's Lab
Python의 Iterator에 대하여 본문
파이썬의 Iterator라는 개념이 존재합니다. 이를 알기 위해서는 Iterable Object에 대해 먼저 알아야 합니다.
Iterable Object
파이썬의 모든 것은 객체로 이루어져 있습니다. 때문에 Iterable Object라는 것은 '반복가능한 데이터'로 해석할 수 있습니다.
Iterable Object 중 가장 익숙한 것이 list, string 등 여러 가지가 있습니다.
li = [1, 2, 3, 4, 5]
list를 보면 for loop를 통해 element에 접근할 수 있습니다.
for element in li:
print(element)
즉, for loop로 element를 하나하나 리턴할 수 있는 객체를 Iterable Object라고 합니다.
Iterator
Iterator란 iterable object를 iter()를 통해 만든 객체입니다.
둘 다 반복 가능한 건 같은데 뭐가 다를까요?
Iterator를 선언하면 iterable object의 element를 순서대로 가져올 수 있습니다.
Iterator는 인덱싱을 할 수 없으며 무조건 순서대로 가져오고, 한 번 쓴 데이터는 다시 쓸 수 없습니다.
그러면 단점밖에 없는 Iterator를 쓸 이유가 없습니다. 그럼에도 불구하고 쓰는 이유는
Iterator는 순서대로 데이터를 가져온 후에 즉각적으로 데이터를 폐기시키기 때문에 대규모 데이터처리에 있어서 매우 효과적이기 때문입니다.
데이터를 순서대로 가져오는 방법은 next()라는 함수를 써서 가져올 수 있습니다.
iterable 하기 때문에 for loop를 이용해서도 가져올 수 있습니다. 물론, next()와 똑같이 한 번쓰고 나면 데이터를 쓸 수 없습니다.
li_iter = iter(li)
print(next(li_iter))
print(next(li_iter))
print(next(li_iter))
print(next(li_iter))
print(next(li_iter))
만약 iterator가 더 이상 가져올 데이터가 없을 때는 어떻게 될까요?
li_iter = iter(li)
print(next(li_iter))
print(next(li_iter))
print(next(li_iter))
print(next(li_iter))
print(next(li_iter))
print(next(li_iter))
Traceback (most recent call last):
File "main.py", line 10, in <module>
print(next(li_iter))
StopIteration
위와 같은 StopIteration이라는 에러가 뜹니다. 이러한 경우에는 아래와 같이 Except 처리를 해주면 되죠.
li_iter = iter(li)
while True:
try:
data = next(li_iter)
print(data)
except StopIteration:
print('End')
break
또한, iter()과 next()에 대해 재밌는 사실이 있습니다.
iter()는 Iterable Object의 메서드 __iter__()와 같은 역할을 합니다.
그리고, next()는 Iterator의 메서드 __next__()와 같은 역할을 합니다.
즉, 아래 코드는 같은 것을 의미한다는 뜻이기도 합니다.
li_iter = iter(li)
print(next(li_iter))
li_iter = li.__iter__()
print(li_iter.__next__())
그리고, Iterator는 next()를 호출하면서 데이터를 즉각적으로 가져오기 때문에 len()이나 인덱싱을 할 수 있는 subscriptable한 객체가 아닙니다.
호출할 때마다 데이터를 가져온다라는 Iterator의 특성을 기억해두고 있으면 이해하기 쉽습니다.
TypeError: object of type 'list_iterator' has no len() # len()
TypeError: 'list_iterator' object is not subscriptable # indexing
Reference
https://blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=youndok&logNo=222073036603
'Code about AI > Python' 카테고리의 다른 글
(os 모듈을 대체하는) pathlib 패키지 (0) | 2023.06.26 |
---|---|
Python의 Generator에 대하여 (2) | 2023.01.10 |
파이썬의 클래스(Class)에 대하여 (2) | 2022.12.08 |
백준 23572번: 승택이의 은밀한 비밀번호 (Python) (0) | 2022.07.24 |
Python, Adj List, Global Variable, Recursive call (0) | 2022.07.07 |