기초

파이썬 반복문과 조건문: for, while, range, enumerate, break, if/elif와 match/case

업데이트: · Skillaria.Top

파이썬 반복문은 같은 동작을 여러 번 실행합니다. for는 컬렉션이나 range()의 요소를 하나씩 꺼내고, while은 조건이 참인 동안 실행합니다. break로 반복을 끝내고, continue로 한 번을 건너뛰며, enumerate()로 순번을 얻습니다. 판단은 if/elif/else가 맡고, 데이터의 모양에 따라 나누는 일은 match/case(Python 3.10 이상)가 맡습니다.

파이썬 반복문은 같은 동작을 반복할 때 씁니다. 쇼핑 목록을 하나씩 확인하거나, 파일의 각 줄을 처리하거나, 사용자가 올바른 숫자를 입력할 때까지 물어볼 때가 그렇습니다. 파이썬의 반복문은 for와 while 두 가지이고, 그 안에서 판단은 if/elif/else와 match/case가 맡습니다. 각 도구를 실제 예제로 살펴보겠습니다.

조건문: if, elif, else

조건문은 식이 참일 때만 블록을 실행합니다. 블록은 4칸 들여쓰기로 구분합니다. 파이썬에는 중괄호가 없으므로 들여쓰기가 틀리면 바로 IndentationError가 발생합니다.

spent = 4200
limit = 5000

if spent > limit:
    print("한도를 초과했습니다")
elif spent > limit * 0.8:
    print("예산의 20% 미만이 남았습니다")
else:
    print("모두 괜찮습니다")

elif 분기는 위에서 아래로 검사하며, 처음 참이 되는 분기 하나만 실행됩니다. 그래서 더 엄격한 조건을 위에 두어야 합니다. 만약 spent > limit * 0.8을 먼저 검사했다면, 한도 초과 메시지는 영영 나오지 않았을 것입니다.

무엇이 참으로 취급되는가

조건식에 꼭 비교 연산을 쓸 필요는 없습니다. False, None, 0(0, 0.0)과 빈 컬렉션("", [], {})은 거짓이고, 나머지는 모두 참입니다. 그래서 '목록이 비어 있지 않은지' 확인하는 코드는 짧게 쓸 수 있습니다.

expenses = []
if not expenses:
    print("아직 지출 내역이 없습니다")

조건은 and, or, not으로 묶을 수 있고, 범위는 비교를 이어서 if 0 < amount <= 100_000:처럼 쓰면 됩니다. 짧게 값을 고를 때는 삼항 연산자를 씁니다: status = "많음" if spent > limit else "정상".

for 반복문: 문법과 예제

파이썬의 for는 C 언어처럼 카운터를 세는 문장이 아니라, 요소를 하나씩 꺼내는 반복문입니다. 리스트, 문자열, 딕셔너리, 파일, range처럼 반복 가능한 객체의 요소를 차례로 가져옵니다. 다른 언어의 foreach가 바로 이것입니다.

expenses = [350, 1200, 89, 4500]
total = 0
for amount in expenses:
    total += amount
print(total)  # 6139

문법은 for 변수 in 컬렉션:이고, 다음 줄부터 들여쓰기한 블록이 이어집니다. 반복이 끝난 뒤에도 변수에는 마지막 값이 남아 있습니다. 가끔 유용하지만, 큰 프로그램에서 이에 의존하는 것은 좋지 않습니다.

문자열, 리스트, 딕셔너리 순회

문자열은 글자 하나씩, 리스트는 요소 하나씩 순회합니다. 딕셔너리를 그냥 순회하면 키가 나옵니다. 키와 값을 함께 얻으려면 .items()를 씁니다.

by_category = {"식비": 3200, "교통": 900, "영화": 600}

for category, amount in by_category.items():
    print(f"{category}: {amount}원")

값만 필요하면 .values()를 씁니다. 순회하는 도중에 딕셔너리의 크기를 바꾸면 RuntimeError: dictionary changed size during iteration 오류가 납니다. 요소를 지워야 한다면 복사본을 순회하세요: for key in list(d):.

range 함수: 숫자 순회

숫자를 순회할 때는 range()를 씁니다. range()는 메모리에 리스트를 만들지 않고 숫자를 하나씩 만들어 내므로, range(10**9)도 바로 시작합니다.

호출생성되는 숫자
range(5)0, 1, 2, 3, 4
range(2, 6)2, 3, 4, 5
range(0, 10, 3)0, 3, 6, 9
range(5, 0, -1)5, 4, 3, 2, 1

기억할 원칙은 하나입니다. 오른쪽 끝 값은 범위에 포함되지 않습니다. range(1, 10)은 9에서 끝나며, 이것이 '한 칸 차이' 오류의 가장 흔한 원인입니다. 간격은 음수가 될 수 있지만 0은 될 수 없습니다.

for i in range(1, 4):
    print(f"{i}일차")
# 1일차
# 2일차
# 3일차

enumerate: 반복문에서 번호 매기기

초보자는 요소의 번호가 필요할 때 for i in range(len(items))를 자주 씁니다. 동작은 하지만 읽기 어렵습니다. enumerate()는 '번호, 요소' 쌍을 만들어 줍니다. start 매개변수로 시작 번호를 정할 수 있습니다.

items = ["커피", "택시", "점심"]
for n, item in enumerate(items, start=1):
    print(n, item)
# 1 커피
# 2 택시
# 3 점심

두 리스트를 나란히 순회하려면 zip()을 씁니다: for name, price in zip(names, prices):. 가장 짧은 리스트에서 멈춥니다. Python 3.10부터는 strict=True를 주면 길이가 다를 때 오류를 냅니다.

while 반복문

while은 조건이 참인 동안 블록을 반복합니다. 반복 횟수를 미리 알 수 없을 때 씁니다. 올바른 입력을 기다릴 때, 데이터를 끝까지 읽을 때, 성공할 때까지 요청을 되풀이할 때가 그렇습니다.

balance = 10_000
month = 0
while balance > 0:
    balance -= 2_700
    month += 1
print(f"돈은 {month}개월 동안 버팁니다")  # 4

가장 큰 위험은 조건에 쓰인 변수를 바꾸는 것을 잊는 것입니다. 그러면 반복문이 끝나지 않습니다. 프로그램이 멈춘 것 같으면 Ctrl+C를 누르세요. 파이썬은 KeyboardInterrupt로 실행을 중단합니다.

무한 반복과 do while 대체

무한 반복은 의도적으로 쓰기도 합니다. while True:를 쓰고 break로 빠져나오는 방식입니다. 파이썬에는 do while 문이 없고, 이 방식이 그 역할을 합니다. 블록이 최소 한 번은 실행되고, 검사는 블록 끝에서 이루어집니다.

while True:
    raw = input("금액: ")
    if raw.isdigit():
        amount = int(raw)
        break
    print("정수를 입력하세요")

for 반복문이 무한히 도는 경우는 드뭅니다. itertools.count() 같은 무한 이터레이터를 순회할 때만 생깁니다.

break와 continue: 반복 빠져나오기와 건너뛰기

break는 반복문을 즉시 끝내고, 반복문 뒤의 코드로 넘어갑니다. continue는 현재 회차의 나머지를 건너뛰고 다음 회차로 넘어갑니다.

expenses = [350, -10, 1200, 0, 99_999, 89]

for amount in expenses:
    if amount <= 0:
        continue          # 이번 회차 건너뛰기
    if amount > 50_000:
        print("의심스러운 금액이므로 중단합니다")
        break             # 반복문 빠져나오기
    print(amount)

350과 1200이 출력되고, 그다음 메시지가 나온 뒤 반복이 끝납니다. 89까지는 도달하지 않습니다. 두 문장 모두 자신이 속한 가장 가까운 반복문에만 영향을 줍니다.

반복문의 else

for

자주 묻는 질문

for와 while은 파이썬에서 어떻게 다른가요?

for는 준비된 순서를 하나씩 돌고 언제 끝날지 스스로 알며, while은 조건이 참인 동안 반복합니다. 반복 횟수가 정해졌거나 컬렉션이 있으면 for를, 어떤 사건을 기다려야 하면 while을 쓰세요.

반복문을 거꾸로 돌리려면 어떻게 하나요?

컬렉션이라면 reversed(items)를, 숫자라면 range(n - 1, -1, -1)을 쓰세요. reversed는 리스트를 복사하지 않고 끝에서부터 순회합니다.

파이썬에도 switch 문이 있나요?

별도의 switch 문은 없습니다. 그 역할은 if/elif 체인과 Python 3.10에 도입된 match/case가 합니다. match는 리스트와 딕셔너리를 모양에 따라 나누고 값을 꺼낼 수 있어 더 많은 일을 합니다.

반복문과 리스트 컴프리헨션 중 어느 쪽이 빠른가요?

[x * 2 for x in items] 같은 컴프리헨션은 같은 일을 하는 append 반복문보다 보통 조금 빠르고 짧습니다. 여러 조건이 얽힌 복잡한 로직에서는 일반 반복문이 더 읽기 쉽습니다.

중첩된 두 반복문을 한 번에 빠져나오려면 어떻게 하나요?

break는 안쪽 반복문만 끝냅니다. 가장 간단한 방법은 반복문을 함수로 빼고 return으로 빠져나오는 것입니다.

영상으로 이 주제 배우기

이 주제는 “Python 3.15: от новичка до профи” 강의에서 실습과 함께 자세히 다룹니다.

강의로 이동