파이썬(Python) 공부 5편
반복문 for / while 완전 정복
반복문은 같은 코드를 여러 번 실행할 때 사용합니다. "리스트의 모든 요소를 출력해라", "조건이 만족되는 동안 계속 실행해라" 같은 작업이 반복문의 영역입니다. for문, while문, range(), break/continue, enumerate, zip까지 실무에서 바로 쓸 수 있도록 정리합니다.
🔄 for 반복문 — 시퀀스를 순서대로 순회
for문은 리스트·문자열·튜플·딕셔너리 같은 반복 가능한(iterable) 객체의 요소를 하나씩 꺼내 처리합니다. 처리할 횟수가 명확할 때 주로 사용합니다.
# 리스트 순회
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
# apple / banana / cherry
# 문자열 순회 — 한 글자씩
for ch in "Python":
print(ch, end=" ") # P y t h o n
print() # 줄바꿈
# 딕셔너리 순회
scores = {"Alice": 90, "Bob": 85, "Carol": 92}
for name, score in scores.items():
print(f"{name}: {score}점")
# Alice: 90점 / Bob: 85점 / Carol: 92점
📊 range() — 숫자 범위 생성하기
range()는 숫자 범위를 생성하는 내장 함수로, for문과 함께 가장 자주 사용됩니다. range(start, stop, step) 형태이며, stop은 포함하지 않습니다.
파란색 = 포함 / 회색 = 제외 | stop 인덱스는 항상 포함되지 않습니다
# range(stop) — 0부터 stop-1까지
for i in range(5):
print(i, end=" ") # 0 1 2 3 4
# range(start, stop) — start부터 stop-1까지
for i in range(1, 6):
print(i, end=" ") # 1 2 3 4 5
# range(start, stop, step) — step 간격으로
for i in range(0, 11, 2):
print(i, end=" ") # 0 2 4 6 8 10
# step 음수 — 역순
for i in range(5, 0, -1):
print(i, end=" ") # 5 4 3 2 1
# 1부터 100까지 합계
total = 0
for i in range(1, 101):
total += i # total = total + i 와 동일
print(total) # 5050
⏳ while 반복문 — 조건이 True인 동안 반복
while문은 조건이 True인 동안 계속 반복합니다. 반복 횟수가 정해지지 않거나, 특정 조건이 만족될 때까지 반복해야 할 때 사용합니다. 조건이 항상 True가 되지 않도록 반드시 탈출 조건을 만들어야 합니다.
# 기본 while문
count = 1
while count <= 5:
print(count, end=" ")
count += 1 # 반드시 카운터 증가 → 탈출 조건
# 1 2 3 4 5
# 숫자 맞추기 게임 — 조건 기반 반복
answer = 7
guess = 0
while guess != answer:
guess += 1
print(f"시도: {guess}")
print("정답!")
# while True + break 패턴 (무한루프 → 명시적 탈출)
n = 1
while True:
print(n, end=" ")
n += 1
if n > 5:
break # 조건 만족 시 탈출
# 1 2 3 4 5
while문 작성 시 반드시 반복이 끝나는 조건을 만들어야 합니다. 무한루프가 발생하면 프로그램이 멈추지 않습니다.
- 터미널에서 무한루프 강제 종료: Ctrl + C
- 카운터 변수를 증가·감소시키거나 break로 탈출 조건을 명시
# ❌ 무한루프 예시 — 절대 멈추지 않음!
# while True:
# print("무한반복") ← count += 없음
# ✅ 올바른 예시
count = 0
while True:
count += 1
if count >= 5: break
🆕 break / continue / else — 반복 흐름 제어
# ① break — 반복문 즉시 종료
for i in range(10):
if i == 5:
break # i가 5이면 반복 종료
print(i, end=" ")
# 0 1 2 3 4
# ② continue — 현재 반복만 건너뛰고 다음으로
for i in range(10):
if i % 2 == 0:
continue # 짝수는 건너뜀
print(i, end=" ")
# 1 3 5 7 9
# ③ for-else — break 없이 정상 종료 시 else 실행
numbers = [2, 4, 6, 8]
for n in numbers:
if n % 2 != 0:
print("홀수 발견!")
break
else:
print("모두 짝수입니다") # break 없이 끝났으므로 실행됨
# while-else도 동일하게 동작
n = 0
while n < 3:
n += 1
else:
print("while 정상 종료") # 실행됨
- break: 반복문 전체를 즉시 종료하고 반복문 밖으로 나감 → 검색에서 원하는 값을 찾았을 때
- continue: 현재 반복만 중단하고 다음 반복으로 넘어감 → 특정 조건의 요소를 건너뛸 때
- for-else / while-else: break 없이 반복이 정상 완료됐을 때만 else 블록 실행 — 검색 실패 처리에 유용
📋 enumerate() — 인덱스와 값 동시에 얻기
enumerate()는 반복 시 인덱스(순서 번호)와 값을 동시에 꺼낼 수 있습니다. 리스트를 순회하면서 몇 번째 요소인지도 알아야 할 때 사용합니다.
fruits = ["apple", "banana", "cherry"]
# ❌ 인덱스를 직접 쓰는 불편한 방법
for i in range(len(fruits)):
print(i, fruits[i])
# ✅ enumerate() — 파이썬스러운 방법
for i, fruit in enumerate(fruits):
print(f"{i}: {fruit}")
# 0: apple / 1: banana / 2: cherry
# start 파라미터 — 시작 번호 지정 (기본값 0)
for i, fruit in enumerate(fruits, start=1):
print(f"{i}번: {fruit}")
# 1번: apple / 2번: banana / 3번: cherry
🔒 zip() — 여러 리스트를 병렬로 순회
zip()은 두 개 이상의 반복 가능한 객체를 묶어 동시에 순회합니다. 길이가 다를 경우 가장 짧은 것에 맞춰집니다.
names = ["Alice", "Bob", "Carol"]
scores = [90, 85, 92]
grades = ["A", "B", "A+"]
# 두 리스트 병렬 순회
for name, score in zip(names, scores):
print(f"{name}: {score}점")
# Alice: 90점 / Bob: 85점 / Carol: 92점
# 세 리스트 동시 순회
for name, score, grade in zip(names, scores, grades):
print(f"{name}: {score}점 ({grade})")
# zip으로 딕셔너리 만들기
result = dict(zip(names, scores))
print(result)
# {'Alice': 90, 'Bob': 85, 'Carol': 92}
🕐 중첩 반복문 — 반복문 안에 반복문
# 구구단 출력
for i in range(2, 10): # 단 (2~9)
for j in range(1, 10): # 곱할 수 (1~9)
print(f"{i} × {j} = {i * j}", end=" ")
print() # 단 끝에 줄바꿈
# 2차원 리스트(행렬) 순회
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
for row in matrix:
for val in row:
print(val, end=" ")
print()
# 1 2 3
# 4 5 6
# 7 8 9
# 중첩 반복문에서 break — 안쪽 반복문만 탈출
for i in range(3):
for j in range(3):
if j == 2:
break # 안쪽 for만 탈출
print(f"({i},{j})", end=" ")
print()
파이썬의 break는 가장 가까운 반복문 하나만 종료합니다. 바깥 루프까지 한 번에 탈출하려면 플래그(flag) 변수를 활용하거나, 함수로 감싸 return을 사용하는 방법이 있습니다.
# 플래그 변수로 바깥 루프 탈출
found = False
for i in range(5):
for j in range(5):
if i * j == 6:
found = True
break
if found: break
📊 for vs while — 언제 무엇을 쓸까
- for 사용: 리스트·문자열·딕셔너리 등 시퀀스를 순회할 때 / 정해진 횟수만큼 반복할 때 (range)
- while 사용: 반복 횟수를 미리 알 수 없을 때 / 특정 조건이 만족될 때까지 반복해야 할 때 / 사용자 입력 처리 / 게임 루프
- 일반 원칙: 횟수가 명확하면 for, 조건 기반이면 while — 파이썬에서는 for문이 더 많이 사용됨
⚡ 리스트 컴프리헨션 맛보기 — for문을 한 줄로
리스트 컴프리헨션은 for문과 조건식을 한 줄로 표현해 새 리스트를 만드는 파이썬만의 강력한 문법입니다. 자세한 내용은 7편(리스트·튜플·딕셔너리)에서 다루고, 여기서는 맛보기로 소개합니다.
# 일반 for문으로 제곱 리스트 만들기
squares = []
for x in range(1, 6):
squares.append(x ** 2)
print(squares) # [1, 4, 9, 16, 25]
# 리스트 컴프리헨션으로 한 줄에
squares = [x ** 2 for x in range(1, 6)]
print(squares) # [1, 4, 9, 16, 25]
# 조건 필터링도 가능
evens = [x for x in range(20) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
📝 5편 실습 문제
- 중첩 for문과 range()를 사용해 아래 모양을 출력하세요
- *
**
***
****
*****
- 2부터 50까지 숫자 중 소수만 출력하기
- 힌트: 소수는 1과 자기 자신으로만 나눠지는 수 / for-else 패턴 활용
# 실습 1 — 별 피라미드
for i in range(1, 6):
print("*" * i)
# * / ** / *** / **** / *****
# 실습 2 — 소수 찾기 (for-else 활용)
for num in range(2, 51):
for i in range(2, num):
if num % i == 0:
break # 나눠지면 소수 아님
else:
print(num, end=" ") # break 없이 끝나면 소수
# 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
- for문: 반복 가능한 객체 순회 / 리스트·문자열·딕셔너리·range() 모두 사용 가능
- range(): range(stop) / range(start, stop) / range(start, stop, step) / stop은 미포함
- while문: 조건이 True인 동안 반복 / 반드시 탈출 조건 필요 / 무한루프 주의 (Ctrl+C로 종료)
- break: 반복문 즉시 종료 / continue: 현재 반복만 건너뜀
- for-else / while-else: break 없이 정상 종료 시 else 블록 실행
- enumerate(): 인덱스+값 동시 순회 / enumerate(iterable, start=0)
- zip(): 여러 리스트 병렬 순회 / 가장 짧은 길이 기준
- 중첩 반복문: break는 가장 가까운 반복문만 종료 / 플래그로 바깥 루프 탈출
- 리스트 컴프리헨션: [표현식 for 변수 in 반복객체 if 조건] (7편에서 심화)
def / return / 매개변수 / 기본값 / *args / **kwargs / lambda / 재귀함수