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

URL: https://skillaria.top/ko/guides/python/python-loops

파이썬 반복문은 같은 동작을 여러 번 실행합니다. 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  50_000:
        print("의심스러운 금액이므로 중단합니다")
        break             # 반복문 빠져나오기
    print(amount)
```

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

### 반복문의 else

for

## FAQ

**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으로 빠져나오는 것입니다.


---
Source: Skillaria.Top (https://skillaria.top)
