이터러블 (iterable)
요약
for문에 넣을 수 있는 대상인 이터러블(iterable)을 정리합니다. 리스트·문자열·range·딕셔너리·제너레이터·map 객체가 무엇을 꺼내는지, sum·sorted·join·map·enumerate처럼 이터러블을 받는 내장 함수까지 한 번에 봅니다.
이터러블 핵심 정리
| 대상 | for x in 대상으로 꺼내지는 값 | 예시 |
|---|---|---|
| 리스트·튜플 | 요소를 앞에서부터 하나씩 | [10, 20] → 10, 20 |
| 문자열 | 문자를 한 글자씩 | "ab" → 'a', 'b' |
| range | 정수를 차례대로 | range(3) → 0, 1, 2 |
| 딕셔너리 | 키만 (값이 아님) | {"a": 1} → 'a' |
| keys / values / items | 키 / 값 / (키, 값) 튜플 | d.items() → ('a', 1) |
| 집합 | 요소 (순서는 보장되지 않음) | {1, 2} → 1, 2 |
| 제너레이터·map 객체 | 꺼낼 때마다 계산한 값 (한 번만) | map(str, [1]) → '1' |
| 이터러블이 아닌 것 | 정수·실수·bool·None | for i in 5 → TypeError |
이터러블이란?
이터러블(iterable)은 여러 값을 차례대로 하나씩 꺼낼 수 있는 대상을 통틀어 이르는 말입니다. 영어 iterate(반복하다)에서 온 말로, "반복해서 꺼낼 수 있는 것"이라는 뜻입니다.
음악 플레이리스트를 떠올리면 쉽습니다. 플레이리스트에 곡이 여러 개 들어 있으면 1번 곡부터 한 곡씩 차례대로 재생되고, 다 듣고 다시 틀면 처음부터 똑같이 나옵니다. 반면 노래 한 곡은 그 자체가 곡이라 "다음 곡"이 없습니다.

가장 쉬운 판별법은 for문입니다. for 변수 in 대상:의 in 뒤에 올 수 있으면 이터러블입니다.
![왼쪽에는 이터러블인 리스트 [10, 20], 문자열 'abc', range(3), 딕셔너리 {'a': 1, 'b': 2}가 각각 10·20, 'a'·'b'·'c', 0·1·2, 키 'a'·'b'를 하나씩 for x in으로 내보내는 모습, 오른쪽에는 이터러블이 아닌 5, 3.14, True, None이 값 하나뿐이라 꺼낼 요소가 없어 for i in 5가 TypeError를 내는 모습을 비교한 다이어그램](/_next/image?url=%2Fcoding%2Fpython%2Fiterable%2Fiterable-vs-not.webp&w=3840&q=75&dpl=dpl_qUfz6RtRVTEUe9jffJ4zP65U2BGn)
문자열 "abc"를 in 뒤에 넣었더니 'a', 'b', 'c'가 차례대로 ch에 들어왔습니다. 그러니 문자열은 이터러블입니다.
이터러블이 아닌 것
정수·실수·bool·None은 값 하나 그 자체일 뿐 안에 담긴 요소가 없으므로 이터러블이 아닙니다. in 뒤에 넣으면 오류가 납니다.
오류 메시지 마지막 줄의 not iterable이 바로 "이터러블이 아니다"라는 뜻입니다. 0부터 4까지 반복하려면 정수 5가 아니라 range(5)를 넣어야 합니다.
이터러블을 받는 내장 함수
Python의 여러 내장 함수는 인자로 리스트만이 아니라 이터러블이면 무엇이든 받습니다. 함수 안에서 for문처럼 값을 하나씩 꺼내 쓰기 때문입니다.
| 함수 | 하는 일 | 예시 → 결과 |
|---|---|---|
| sum(이터러블) | 모든 값을 더함 | sum(range(4)) → 6 |
| sorted(이터러블) | 정렬한 새 리스트 반환 | sorted("cab") → ['a', 'b', 'c'] |
| '구분자'.join(이터러블) | 문자열 요소를 구분자로 이어 붙임 | "-".join("abc") → 'a-b-c' |
| map(함수, 이터러블) | 각 값에 함수를 적용한 map 객체 반환 | list(map(str, [1, 2])) → ['1', '2'] |
| enumerate(이터러블) | (인덱스, 값) 쌍을 하나씩 내놓음 | list(enumerate("ab")) → [(0, 'a'), (1, 'b')] |
| all(이터러블) / any(이터러블) | 모두 참인지 / 하나라도 참인지 | any(x > 2 for x in [1, 3]) → True |
list() / tuple() / set() | 꺼낸 값으로 리스트·튜플·집합을 만듦 | list(range(3)) → [0, 1, 2], tuple("ab") → ('a', 'b') |
같은 함수라도 어떤 이터러블을 넣느냐에 따라 꺼내지는 값이 달라집니다. 맨 위 핵심 정리 표의 "꺼내지는 값" 규칙을 그대로 적용하면 됩니다.
인자 자리에 제너레이터 표현식을 바로 넣는 sum(len(x) for x in m), ''.join(c for c in y if ...) 같은 형태도 쓸 수 있습니다. 제너레이터도 이터러블이기 때문에 가능한 문법으로, sum, any, all과 함께 쓰기에서 자세히 다룹니다.