본문으로 바로가기
Lab

파이썬(Python) for문 사용법, 자주 쓰는 반복을 직접 실행해 보니

파이썬 for문에서 자주 쓰는 반복 8가지와 Claude Code가 쓴 반복 코드를 맥에서 한 번씩 실행했습니다. 끝값이 빠지는 range, 번호 붙이기, 반복 중 삭제 때 남는 값까지 코드와 출력을 그대로 담았습니다.

·

번호가 붙은 상자들이 컨베이어 벨트를 따라 하나씩 고리를 지나가는 개념 삽화
파이썬(Python) for문 사용법, 자주 쓰는 반복을 직접 실행해 보니 표지 삽화

파이썬 for문에서 range(1, 6)을 돌리면 6은 나오지 않고 [1, 2, 3, 4, 5]까지만 나옵니다. 그리고 반복하는 도중에 [1, 2, 2, 3]에서 2를 지우면 [1, 3]이 아니라 [1, 2, 3]이 남습니다. 이 글은 파이썬에서 자주 쓰는 반복 8가지를 맥 한 대에서 한 번씩 직접 실행한 기록입니다. 마지막에는 Claude Code에게 반복 코드를 맡겨 봤는데, 6.5초 만에 끝났습니다.

따라 할 순서 한눈에 보기

아래 순서대로 터미널에 붙여 넣으면 같은 결과를 확인할 수 있습니다. 코드와 출력은 이어지는 절에서 한 번씩 보여 드립니다.

  1. 파이썬 버전 확인하기
  2. 숫자 범위로 반복하기(시작·끝·간격)
  3. 리스트와 문자열 돌기
  4. 번호 붙이기와 두 리스트 함께 돌기
  5. 딕셔너리를 키와 값으로 돌기
  6. 건너뛰기, 멈추기, 끝까지 돌았을 때만 실행하기
  7. 반복 안에 반복 넣기(구구단 일부)
  8. 반복하면서 리스트를 지울 때 생기는 문제 확인하기
  9. Claude Code에게 반복 코드를 맡기고 실행하기

함께 읽을 글

어떤 환경에서 실행했나요?

맥(darwin arm64) 한 대의 새 임시 폴더에서 각 명령을 한 번씩 실행했습니다. Homebrew로 설치돼 있던 python3를 썼고, 코드는 python3 - <<'PY' ... PY 형태로 표준 입력에 넣어 바로 실행했어요. 9단계 모두 종료 코드는 0이었습니다.

단계걸린 시간종료 코드
1~8. 파이썬 반복 예제각 0.0초0
9. Claude Code에게 반복 코드 맡기기6.5초0

먼저 버전부터 확인했습니다.

$ python3 --version
Python 3.15.0

숫자 범위로 반복하는 방법

정해진 횟수만큼 돌리고 싶다면 range()를 씁니다. 인자를 하나만 주면 0부터 시작하고, 둘을 주면 시작과 끝, 셋을 주면 간격까지 정할 수 있습니다.

$ python3 - <<'PY'
for i in range(3):
    print(i, end=" ")
print()
print(list(range(1, 6)), list(range(0, 10, 3)), list(range(5, 0, -1)))
PY
0 1 2
[1, 2, 3, 4, 5] [0, 3, 6, 9] [5, 4, 3, 2, 1]

그런데 왜 range(3)에는 3이 없을까요? 파이썬 공식 자습서의 제어 흐름은 끝값이 만들어지는 수열에 포함되지 않는다고 설명합니다. 그래서 range(10)은 길이 10인 시퀀스의 올바른 인덱스 10개를 만들죠. 간격은 음수도 되기 때문에 range(5, 0, -1)처럼 거꾸로 셀 수 있습니다.

파이썬 for문 사용법 순서를 단계별로 그린 도식
이번 실행에서 확인한 결과. range는 끝 숫자를 포함하지 않았고 enumerate는 시작 번호를 정할 수 있었다
도식출처: 직접 실행한 순서

숫자 말고 리스트나 문자열을 직접 돌 수도 있습니다. 다음 단계가 그 방법입니다.

리스트와 문자열을 도는 방법

파이썬의 for문은 C처럼 반복 단계와 중지 조건을 직접 정하지 않습니다. 공식 자습서에 따르면 리스트나 문자열 같은 시퀀스의 항목을 들어 있는 순서대로 하나씩 꺼냅니다.

$ python3 - <<'PY'
for fruit in ["사과", "바나나"]:
    print(fruit)
for ch in "파이썬":
    print(ch, end="/")
print()
PY
사과
바나나
파/이/썬/

문자열 "파이썬"은 글자 하나씩 파, 이, 썬으로 나뉘어 나왔습니다. 그렇다면 몇 번째 항목인지도 함께 알고 싶을 때는 어떻게 할까요?

번호를 붙이고 두 리스트를 함께 도는 방법

인덱스가 필요할 때 range(len(a))를 써도 되지만, 공식 자습서는 그럴 때 대부분 enumerate()가 편리하다고 말합니다. 두 리스트를 짝지어 돌 때는 zip()을 씁니다.

$ python3 - <<'PY'
names = ["민수", "지영", "철수"]
scores = [90, 85, 77]
for i, name in enumerate(names, 1):
    print(i, name)
for name, score in zip(names, scores):
    print(name, score)
PY
1 민수
2 지영
3 철수
민수 90
지영 85
철수 77

내장 함수 문서를 보면 enumerate()의 시작 번호 기본값은 0입니다. 그래서 두 번째 인자로 1을 줬더니 1번부터 번호가 붙었죠. 화면에 "1위, 2위"처럼 사람이 읽는 번호를 보여 줄 때 쓰기 좋습니다.

이름 구슬 줄과 점수 구슬 줄이 한 쌍씩 묶여 차례로 나아가는 개념 삽화
두 리스트의 같은 자리 항목이 한 쌍으로 묶여 함께 나오는 모습을 그린 개념 그림입니다.

딕셔너리를 키와 값으로 도는 방법

설정값이나 가격표처럼 이름과 값이 짝인 데이터는 딕셔너리에 담는 경우가 많습니다. 이럴 때는 items()로 키와 값을 한 번에 꺼낼 수 있어요.

$ python3 - <<'PY'
prices = {"커피": 4500, "빵": 3000}
for item, price in prices.items():
    print(f"{item}: {price}원")
PY
커피: 4500원
빵: 3000원

데이터를 끝까지 도는 방법은 여기까지입니다. 이제 도중에 흐름을 바꾸는 방법을 보겠습니다.

중간에 건너뛰거나 멈추는 방법

continue는 남은 코드를 건너뛰고 다음 반복으로 넘어가고, break는 가장 가까운 반복을 빠져나갑니다. 그리고 for문 뒤에 붙인 else는 break 없이 끝까지 돌았을 때만 실행됩니다.

$ python3 - <<'PY'
for n in range(1, 10):
    if n % 2 == 0:
        continue
    if n > 7:
        break
    print(n, end=" ")
print()
for n in [3, 5, 7]:
    if n == 4:
        break
else:
    print("4가 없어서 끝까지 돌았다")
PY
1 3 5 7
4가 없어서 끝까지 돌았다

짝수는 continue로 건너뛰었고, 7보다 큰 홀수에서 break가 걸려 9는 출력되지 않았습니다. 두 번째 반복은 4를 찾지 못해 끝까지 돌았기 때문에 else가 실행됐어요. 공식 자습서는 이 else가 if가 아니라 for 루프에 속하고, return이나 예외로 일찍 끝나도 건너뛴다고 설명합니다.

반복이 끝나는 방식별로 else 절이 실행되는지 비교한 표
공식 자습서 설명에 따라 반복이 끝나는 방식별로 else 절 실행 여부를 정리했습니다.
도식출처: 근거를 바탕으로 코드가 그린 도식

반복 안에 반복을 넣는 방법

for문 안에 for문을 넣으면 바깥 반복이 한 번 돌 때마다 안쪽 반복이 처음부터 끝까지 돕니다. 예를 들어 구구단 2단과 3단의 앞부분은 이렇게 나옵니다.

$ python3 - <<'PY'
for dan in range(2, 4):
    for k in range(1, 4):
        print(f"{dan} x {k} = {dan * k}")
PY
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9

여기서도 끝값이 빠지는 규칙 때문에 range(2, 4)는 2단과 3단만, range(1, 4)는 1부터 3까지만 만들었습니다.

반복하면서 리스트를 지우면 생기는 문제

이번 실행에서 오류는 나지 않았습니다. 종료 코드도 0이었죠. 그런데 결과가 기대와 달랐습니다.

$ python3 - <<'PY'
nums = [1, 2, 2, 3]
for n in nums:
    if n == 2:
        nums.remove(n)
print("반복 중 remove:", nums)
nums = [1, 2, 2, 3]
print("새 리스트로:", [n for n in nums if n != 2])
PY
반복 중 remove: [1, 2, 3]
새 리스트로: [1, 3]

2를 모두 지우려 했는데 하나가 남았습니다. 공식 자습서는 컬렉션을 도는 동안 같은 컬렉션을 수정하는 코드는 올바르게 동작하도록 만들기 힘들다고 말하고, 복사본으로 돌거나 새 컬렉션을 만드는 편이 간단하다고 안내합니다. 자습서에 실린 딕셔너리 예시는 다음과 같습니다.

# 샘플 컬렉션을 만듭니다
users = {'Hans': 'active', 'Éléonore': 'inactive', '홍길동': 'active'}

# 전략:  사본을 이터레이트
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# 전략:  새 컬렉션 만들기
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status

오류 없이 틀린 값이 남는 경우라서 더 놓치기 쉽습니다. AI 에이전트가 만든 코드에서 반복문 안에 remove나 del이 보인다면, 새 리스트를 만드는 방식인지부터 확인해 보세요.

AI에게 반복 코드를 맡기면 어떻게 나올까요?

마지막으로 이미 로그인된 Claude Code 2.1.309에 --model opus로 반복 코드를 맡기고, 받은 코드를 바로 실행했습니다. 아래는 그 실행에서 나온 코드와 결과 그대로이고, 같은 요청이라도 실행할 때마다 다른 코드가 나올 수 있습니다.

$ claude --model opus -p "1부터 20까지 숫자 중 3의 배수는 '짝', 나머지는 숫자를 한 줄에 공백으로 이어 출력하는 파이썬 for문 코드만 출력해. 설명이나 코드 블록 표시는 붙이지 마." > loop.py && cat loop.py && python3 loop.py
for i in range(1, 21):
    print('짝' if i % 3 == 0 else i, end=' ')
1 2 짝 4 5 짝 7 8 짝 10 11 짝 13 14 짝 16 17 짝 19 20

20까지 포함하려고 끝값을 21로 쓴 점이 눈에 띕니다. 걸린 시간은 6.5초, 종료 코드는 0이었어요. 이렇게 AI가 쓴 반복문을 받으면 range의 끝값이 의도한 마지막 숫자보다 1 큰지부터 확인하면 좋습니다.

파이썬 반복문은 for문만 있나요?

아닙니다. 공식 자습서는 for문과 함께 while 문도 소개합니다. 앞에서 본 break와 else도 while 루프에서 쓸 수 있는데, 이때 else는 조건이 거짓이 된 뒤에 실행됩니다. 정해진 데이터를 차례로 돌 때는 for문, 조건이 맞는 동안 계속 돌 때는 while문을 고르면 됩니다.

측정 조건과 한계

이 기록은 맥(darwin arm64) 한 대에서 Python 3.15.0으로 각 명령을 한 번씩 실행한 결과입니다. 1~8단계의 0.0초는 반복 예제가 아주 짧아서 나온 값이에요. 그래서 반복 방식끼리의 속도 차이를 말해 주지는 않습니다. Claude Code의 6.5초와 생성된 코드도 이번 한 번의 결과이고, 모델이나 실행 시점에 따라 달라질 수 있습니다. 여러분의 환경에서 같은 명령을 돌려 보고 출력이 같은지 비교해 보세요.

참고 자료