숫자를 찍어내는 도구
range()가 하는 일은 딱 한 가지예요: 정수들의 시퀀스를 만드는 것. 특정 횟수만큼 반복해야 하거나 숫자 구간을 훑어나가야 할 때 for 반복문과 단골로 함께 다니는 짝꿍이에요.
가장 단순한 형태는 인자 하나 — stop 값 — 을 받아요:
출력:
0
1
2
3
4
초보자들이 자주 걸려 넘어지는 두 가지:
- 세기는 0에서 시작해요.
range(5)는 0부터 시작해서 다섯 개의 숫자를 줍니다. - stop 값은 포함되지 않아요.
range(5)는 5에 도달하기 전에 멈춥니다 — 5는 들어가지 않아요.
이 규칙은 파이썬의 슬라이싱, 인덱싱, range 연산에 일관되게 적용됩니다. "stop은 제외"가 몸에 배면 더 이상 헷갈리지 않을 거예요.
세 가지 형태
range()는 인자 한 개, 두 개, 세 개를 받을 수 있어요:
step은 매 번 뛰는 크기예요. range(0, 20, 4)는 네 번째마다의 숫자를 만들어 줍니다. "한 칸 건너씩"이나 "10개마다 하나"가 필요할 때 떠올려 보세요.
거꾸로 세기
step은 음수도 될 수 있어서, 거꾸로 셀 수 있어요:
여기서도 stop은 포함되지 않아요 — range(10, 0, -1)은 0 직전에 멈춥니다. 0까지 포함하려면 stop을 -1로 두세요:
range는 지연 평가돼요
Python 3에서 range()는 숫자 리스트를 메모리에 만들지 않아요. 숫자를 하나씩, 요청될 때 만들어내는 가벼운 range 객체를 돌려줍니다. 그래서 이런 게 가능해요:
10억 개짜리 "range"도 사실상 메모리를 쓰지 않아요. 숫자는 반복문이 요구할 때 만들어집니다.
진짜로 숫자 리스트가 필요하다면 — 수정하고, 정렬하고, 기본 범위를 넘는 인덱싱을 하고 싶다면 — 명시적으로 변환하세요:
대부분의 경우에는 리스트가 필요 없어요. for i in range(...)가 바로 동작하거든요.
자주 쓰는 패턴
끊임없이 쓰게 될 레시피 몇 가지:
n번 반복하기.
_는 "이 값은 신경 안 써"라는 관례예요 — 파이썬이 강제하는 건 아니지만 어떤 독자든 그 의도를 알아봅니다.
시퀀스에 인덱스로 접근하기.
보통은 range(len(...))보다 enumerate()가 낫지만, 인덱스 만 필요할 때는:
그래도 대부분의 경우 enumerate(items)가 더 깔끔해요.
한 칸 건너씩 순회.
a, c, e를 출력합니다. 단순 슬라이싱이라면 슬라이싱 문법이 더 직관적이긴 해요: items[::2].
빠르게 숫자 리스트 만들기.
이건 리스트 컴프리헨션이에요 — 뒤에서 다룹니다 — range가 여기에 숫자를 공급하죠.
range()가 아닌 것들
알아둘 만한 날선 경계 두 가지:
range는 정수만 만듭니다. 부동소수점 단계(예: 0.0부터 1.0까지 0.1 간격)가 필요하면numpy.arange를 쓰거나 직접 카운터를 관리하는 반복문을 쓰세요.range는 임의의 이터러블에 쓰는 게 아니에요. 정수 전용입니다. 리스트 "range"를 하고 싶다면 사실은enumerate나 리스트 자체를 원하는 것일 거예요.
다 모아서
한 번에 여러 변형을 쓰는 작은 예제:
range로 돌아가는 두 개의 중첩 반복문이 격자를 만들어냅니다. 두 반복문이 모두 1에서 시작한다는 점 — range(1, 6) — 에 주목하세요. 1부터 5까지의 라벨이 필요하니까요.
컬렉션으로 넘어가기
이제 조건문, 두 종류의 반복문, range까지 봤어요. 어떤 컬렉션도 다룰 수 있을 만큼 제어 흐름을 갖춘 거예요. 다음 챕터는 컬렉션 자체입니다 — 리스트, 튜플, 집합, 딕셔너리.
자주 묻는 질문
파이썬의 range()는 뭘 하나요?
range()는 정수들의 시퀀스를 만들어냅니다. range(n)은 0부터 n-1까지를 주고, range(start, stop)은 start부터 stop 직전까지의 정수를, range(start, stop, step)은 단계 크기까지 고를 수 있어요. 거꾸로 세고 싶으면 음수 step을 쓰면 돼요.
range()가 리스트를 만드나요?
아니요. Python 3에서 range()는 가벼운 range 객체를 돌려주고, 숫자는 요청될 때 그때그때 생성됩니다. 그래서 range(10**9)도 즉시 실행돼요 — 실제로 10억 개의 정수를 메모리에 올리지 않거든요. 진짜로 리스트가 필요하면 list(...)로 감싸세요.
파이썬에서 range()로 거꾸로 세려면요?
음수 step을 쓰세요: range(10, 0, -1)은 10, 9, 8, ..., 1을 내놓습니다. stop 값은 항상 포함되지 않는다는 걸 기억하세요. 0까지 포함하고 싶다면 range(10, -1, -1)이 필요해요.