Menu

파이썬 range(): start, stop, step, 그리고 거꾸로 세기

파이썬의 range()가 어떻게 동작하는지 — start, stop, step, 음수 range, 그리고 왜 리스트를 만들지 않고 지연 평가되는지까지.

숫자를 찍어내는 도구

range()가 하는 일은 딱 한 가지예요: 정수들의 시퀀스를 만드는 것. 특정 횟수만큼 반복해야 하거나 숫자 구간을 훑어나가야 할 때 for 반복문과 단골로 함께 다니는 짝꿍이에요.

가장 단순한 형태는 인자 하나 — stop 값 — 을 받아요:

main.py
Output
Click Run to see the output here.

출력:

0
1
2
3
4

초보자들이 자주 걸려 넘어지는 두 가지:

  1. 세기는 0에서 시작해요. range(5)는 0부터 시작해서 다섯 개의 숫자를 줍니다.
  2. stop 값은 포함되지 않아요. range(5)는 5에 도달하기 전에 멈춥니다 — 5는 들어가지 않아요.

이 규칙은 파이썬의 슬라이싱, 인덱싱, range 연산에 일관되게 적용됩니다. "stop은 제외"가 몸에 배면 더 이상 헷갈리지 않을 거예요.

세 가지 형태

range()는 인자 한 개, 두 개, 세 개를 받을 수 있어요:

main.py
Output
Click Run to see the output here.

step은 매 번 뛰는 크기예요. range(0, 20, 4)는 네 번째마다의 숫자를 만들어 줍니다. "한 칸 건너씩"이나 "10개마다 하나"가 필요할 때 떠올려 보세요.

거꾸로 세기

step은 음수도 될 수 있어서, 거꾸로 셀 수 있어요:

main.py
Output
Click Run to see the output here.

여기서도 stop은 포함되지 않아요 — range(10, 0, -1)은 0 직전에 멈춥니다. 0까지 포함하려면 stop을 -1로 두세요:

main.py
Output
Click Run to see the output here.

range는 지연 평가돼요

Python 3에서 range()는 숫자 리스트를 메모리에 만들지 않아요. 숫자를 하나씩, 요청될 때 만들어내는 가벼운 range 객체를 돌려줍니다. 그래서 이런 게 가능해요:

main.py
Output
Click Run to see the output here.

10억 개짜리 "range"도 사실상 메모리를 쓰지 않아요. 숫자는 반복문이 요구할 때 만들어집니다.

진짜로 숫자 리스트가 필요하다면 — 수정하고, 정렬하고, 기본 범위를 넘는 인덱싱을 하고 싶다면 — 명시적으로 변환하세요:

main.py
Output
Click Run to see the output here.

대부분의 경우에는 리스트가 필요 없어요. for i in range(...)가 바로 동작하거든요.

자주 쓰는 패턴

끊임없이 쓰게 될 레시피 몇 가지:

n번 반복하기.

main.py
Output
Click Run to see the output here.

_는 "이 값은 신경 안 써"라는 관례예요 — 파이썬이 강제하는 건 아니지만 어떤 독자든 그 의도를 알아봅니다.

시퀀스에 인덱스로 접근하기.

보통은 range(len(...))보다 enumerate()가 낫지만, 인덱스 필요할 때는:

main.py
Output
Click Run to see the output here.

그래도 대부분의 경우 enumerate(items)가 더 깔끔해요.

한 칸 건너씩 순회.

main.py
Output
Click Run to see the output here.

a, c, e를 출력합니다. 단순 슬라이싱이라면 슬라이싱 문법이 더 직관적이긴 해요: items[::2].

빠르게 숫자 리스트 만들기.

main.py
Output
Click Run to see the output here.

이건 리스트 컴프리헨션이에요 — 뒤에서 다룹니다 — range가 여기에 숫자를 공급하죠.

range()가 아닌 것들

알아둘 만한 날선 경계 두 가지:

  1. range는 정수만 만듭니다. 부동소수점 단계(예: 0.0부터 1.0까지 0.1 간격)가 필요하면 numpy.arange를 쓰거나 직접 카운터를 관리하는 반복문을 쓰세요.
  2. range는 임의의 이터러블에 쓰는 게 아니에요. 정수 전용입니다. 리스트 "range"를 하고 싶다면 사실은 enumerate나 리스트 자체를 원하는 것일 거예요.

다 모아서

한 번에 여러 변형을 쓰는 작은 예제:

main.py
Output
Click Run to see the output here.

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)이 필요해요.

Coddy로 코딩 배우기

시작하기