08. 반복문
for로 컬렉션의 모든 항목을 하나씩 처리한다.range()로 원하는 횟수만큼 반복한다.while로 조건이 참인 동안 반복한다.break·continue로 반복을 제어하고,enumerate()를 파이썬답게 쓴다.
같은 일을 반복하기
"학생 30명에게 한 명씩 인사하기"를 print() 30번으로 쓴다면 끔찍하겠죠. 반복문(loop)은 같은 작업을 자동으로 되풀이합니다.
Python의 반복문은 두 종류입니다.
| 반복문 | 언제 쓰나 | 한 줄 요약 |
|---|---|---|
for | 횟수가 정해져 있거나 컬렉션을 훑을 때 | "이 목록의 각 항목에 대해…" |
while | 조건이 참인 동안 계속할 때 | "이 조건이 만족되는 한 계속…" |
for 반복문: 항목을 하나씩
for는 리스트·문자열 같은 컬렉션의 항목을 하나씩 꺼내 처리합니다.
fruits = ["사과", "배", "감"] for fruit in fruits: print(f"{fruit}를 먹습니다") # 출력: # 사과를 먹습니다 # 배를 먹습니다 # 감를 먹습니다
읽는 법: "fruits의 각 항목을 fruit에 담아, 하나씩, 블록을 실행하라". fruit은 우리가 정한 이름으로, 반복마다 다음 항목으로 바뀝니다.
flowchart LR
List["['사과','배','감']"]:::data --> Loop{"다음 항목<br/>있나?"}:::proc
Loop -->|사과| Body["fruit = '사과'<br/>→ 블록 실행"]:::result
Body --> Loop
Loop -->|배| Body
Loop -->|감| Body
Loop -->|없음| End([반복 끝]):::start
classDef data fill:#a8dadc,stroke:#457b9d,color:#1d3557
classDef proc fill:#fff3b0,stroke:#e0a800,color:#5c4500
classDef result fill:#b8e6c1,stroke:#34a853,color:#14532d
classDef start fill:#fff3b0,stroke:#e0a800,color:#5c4500
문자열도 컬렉션이라 한 글자씩 순회됩니다.
for ch in "abc": print(ch) # a # b # c
range(): 정해진 횟수만큼
"5번 반복" 같은 경우엔 range()를 씁니다. range(n)은 0부터 n-1까지의 숫자를 만들어냅니다.
for i in range(5): print(i) # 0 # 1 # 2 # 3 # 4
range(5)는 0,1,2,3,4 — 즉 5는 포함하지 않습니다. 4장 슬라이싱에서 본 "끝 미포함" 규칙과 똑같습니다. 횟수는 5번이 맞지만, 값은 0부터 시작해 4에서 끝납니다.range는 시작값과 간격도 정할 수 있습니다.
| 형태 | 의미 | 만들어지는 값 |
|---|---|---|
range(5) | 0부터 5 전까지 | 0,1,2,3,4 |
range(1, 6) | 1부터 6 전까지 | 1,2,3,4,5 |
range(0, 10, 2) | 0부터 10 전까지 2씩 | 0,2,4,6,8 |
for i in range(1, 6): print(i, end=" ") # 1 2 3 4 5 print() for i in range(0, 10, 2): print(i, end=" ") # 0 2 4 6 8
_(밑줄)를 이름으로 씁니다.```python
for _ in range(3):
print("삡!") # 변수를 안 쓸 땐 _
```
⭐ enumerate(): 번호와 값을 동시에
"목록을 번호와 함께" 출력하고 싶을 때가 많습니다. 인덱스를 직접 관리하는 것보다 enumerate()가 파이썬답습니다.
fruits = ["사과", "배", "감"] # ❌ 나쁜 예: 인덱스를 손으로 관리 i = 0 for fruit in fruits: print(f"{i}: {fruit}") i += 1 # ✅ 좋은 예: enumerate가 번호를 알아서 for i, fruit in enumerate(fruits): print(f"{i}: {fruit}") # 0: 사과 # 1: 배 # 2: 감
enumerate()는 (번호, 값) 쌍을 내놓고, 6장의 언패킹으로 i, fruit에 동시에 받습니다. 번호를 1부터 시작하려면 enumerate(fruits, start=1)을 씁니다.
i = 0; i += 1 대신 enumerate()를 써라.딕셔너리 순회
6장에서 예고한 .items()가 여기서 빛납니다. 키와 값을 동시에 훑습니다.
person = {"name": "민지", "age": 25, "city": "서울"}
for key, value in person.items():
print(f"{key}: {value}")
# name: 민지
# age: 25
# city: 서울
.items() 없이 그냥 for key in person:을 돌리면 키만 나옵니다. 값까지 필요하면 .items() + 언패킹이 정석입니다.
while 반복문: 조건이 참인 동안
while은 횟수가 아니라 조건으로 반복합니다. 조건이 참인 한 계속 돕니다.
count = 0 while count < 3: print(f"카운트: {count}") count += 1 # 카운트: 0 # 카운트: 1 # 카운트: 2
```python
count = 0
while count < 3:
print(count)
# count += 1 을 빠뜨림! → count가 영원히 0 → 무한 반복!
```
무한 루프에 빠지면 터미널에서
Ctrl + C로 강제 종료할 수 있습니다. while을 쓸 땐 "조건을 언젠가 거짓으로 만드는 코드"(여기선 count += 1)가 있는지 꼭 확인하세요.for vs while, 언제 무엇을?
- for: 반복 횟수나 대상이 정해져 있을 때 (목록 순회, n번 반복) — 대부분의 경우
- while: 언제 끝날지 미리 모를 때 (사용자가 "quit"을 칠 때까지, 조건이 만족될 때까지)
# while이 자연스러운 예: 올바른 입력을 받을 때까지 while True: answer = input("계속할까요? (y/n): ") if answer == "y": print("계속합니다") break elif answer == "n": print("종료합니다") break else: print("y 또는 n만 입력하세요")
break와 continue: 반복 제어
반복 도중에 흐름을 바꾸는 두 명령입니다.
| 키워드 | 하는 일 |
|---|---|
break | 반복을 즉시 완전히 중단하고 빠져나감 |
continue | 이번 회차만 건너뛰고 다음 회차로 |
# break: 5를 만나면 멈춤 for i in range(10): if i == 5: break print(i, end=" ") # 0 1 2 3 4 print() # continue: 짝수는 건너뛰고 홀수만 출력 for i in range(10): if i % 2 == 0: continue print(i, end=" ") # 1 3 5 7 9
flowchart TD
Loop{"반복 중"}:::proc --> Check{"조건?"}:::proc
Check -->|break| Out([반복 완전 종료]):::err
Check -->|continue| Loop
Check -->|보통| Body["블록 실행"]:::result --> Loop
classDef proc fill:#fff3b0,stroke:#e0a800,color:#5c4500
classDef result fill:#b8e6c1,stroke:#34a853,color:#14532d
classDef err fill:#f4b6b6,stroke:#d64545,color:#7a1f1f
자주 쓰는 반복 패턴: 누적
반복하며 값을 쌓는 것은 매우 흔한 패턴입니다. 빈 그릇을 준비해두고 반복마다 더합니다.
# 합계 누적 total = 0 for n in [10, 20, 30]: total += n print(total) # 60 # 리스트 만들기 squares = [] for i in range(1, 6): squares.append(i ** 2) print(squares) # [1, 4, 9, 16, 25]
sum([10, 20, 30])은 60을 바로 돌려줍니다. 또한 위 squares 같은 "리스트 만들기"는 리스트 컴프리헨션이라는 더 파이썬다운 한 줄 표현으로 쓸 수 있는데, 이는 중급편에서 다룹니다.이 장에서 배운 것
for는 컬렉션의 항목을 하나씩 꺼내 처리한다. 문자열·리스트·딕셔너리 모두 순회 가능.range(n)은 0부터 n-1까지 숫자를 만든다(끝 미포함).range(시작, 끝, 간격)도 가능.- 번호가 필요하면
enumerate(), 딕셔너리는.items()+ 언패킹이 파이썬답다. while은 조건이 참인 동안 반복한다. 조건을 갱신하지 않으면 무한 루프(Ctrl+C로 탈출).break는 반복을 완전히 끝내고,continue는 이번 회차만 건너뛴다.
🧪 실습 문제
문제 1. for와 range()를 이용해 1부터 10까지의 합을 구해 출력하세요. (결과: 55)
문제 2. 다음 코드의 출력은?
for i in range(2, 11, 2): print(i, end=" ")
문제 3. 리스트 names = ["민지", "현우", "수빈"]을 enumerate(start=1)로 순회해 1번: 민지 형태로 출력하세요.
문제 4. 1부터 20까지 중 3의 배수만 출력하되, continue를 사용하세요. (3의 배수가 아니면 건너뛰기)
문제 5. while을 사용해, 사용자가 "quit"을 입력할 때까지 입력을 계속 받아 그대로 따라 출력(에코)하는 프로그램을 작성하세요. "quit"이면 "종료합니다"를 출력하고 반복을 끝내세요.
<details>
<summary>✅ 정답·해설 보기</summary>
1.
total = 0 for i in range(1, 11): # 1~10 (11은 미포함) total += i print(total) # 55 # 참고: sum(range(1, 11)) 로도 가능
2. 2 4 6 8 10. range(2, 11, 2)는 2부터 11 전까지 2씩 증가합니다.
3.
names = ["민지", "현우", "수빈"] for i, name in enumerate(names, start=1): print(f"{i}번: {name}")
4.
for i in range(1, 21): if i % 3 != 0: continue print(i, end=" ") # 3 6 9 12 15 18
5.
while True: text = input("입력: ") if text == "quit": print("종료합니다") break print(text)
</details>
◀️ 이전 장: 07. 조건문 | ▶️ 다음 장: 09. 함수