조건문과 반복문: 흐름을 설계하기
if, elif, else로 상황에 따라 다르게 움직이고, for와 while로 같은 일을 반복하는 법을 익혀요. 들여쓰기, 무한 반복, break와 continue, 그리고 숫자 맞히기 게임까지 만들어 봐요.
지금까지 만든 프로그램은 위에서 아래로 한 번 흐르고 끝났어요. 현실의 일은 그렇지 않죠. "비가 오면 우산을 챙긴다", "숙제를 다 할 때까지 반복한다"처럼 조건에 따라 갈라지고 반복돼요. 이번 강의에서 배우는 조건문과 반복문은 프로그램에 판단력과 지구력을 주는 도구예요.
조건문: 갈림길 만들기
if
temperature = 31
if temperature >= 30:
print("폭염이에요. 물을 자주 드세요.")
print("오늘의 날씨 안내를 마칩니다.")
if 뒤의 조건이 참(True)이면 아래에 들여쓴 줄을 실행하고, 거짓이면 건너뛰어요. 마지막 print는 들여쓰지 않았으니 조건과 상관없이 항상 실행돼요.
들여쓰기가 곧 문법이다
다른 언어는 중괄호로 범위를 묶지만, 파이썬은 들여쓰기로 묶어요. 같은 깊이로 들여쓴 줄들이 한 덩어리(블록)예요.
- 콜론(
:) 다음 줄부터 들여써요. - 관례는 공백 4칸이에요. VS Code에서 Tab을 누르면 자동으로 4칸이 들어가요.
- 공백과 탭을 섞으면
IndentationError가 나요.
else와 elif
score = 82
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "F"
print(f"점수 {score}점은 {grade}등급입니다.")
elif는 "앞의 조건이 거짓이면 이것도 확인해 봐"예요. 위에서부터 차례로 확인하다가 처음으로 참인 곳 하나만 실행하고 나머지는 건너뛰어요. 그래서 순서가 중요해요. 위 코드에서 score >= 70을 맨 앞에 두면 90점도 C가 돼요.
팁 조건이 여러 개일 때는 범위가 좁은(까다로운) 조건부터 위에 두세요. 넓은 조건이 먼저 오면 뒤의 조건은 영영 실행되지 않아요.
참으로 취급되는 값
조건에는 비교식이 아닌 값도 올 수 있어요. 파이썬은 이런 값들을 거짓으로 봐요.
0,0.0- 빈 문자열
"" - 빈 리스트
[], 빈 딕셔너리 등 빈 묶음 None,False
나머지는 모두 참이에요. 그래서 이런 코드가 자연스러워요.
name = input("이름: ")
if name:
print(f"안녕하세요, {name}님")
else:
print("이름을 입력하지 않았어요.")
for 반복문: 정해진 만큼 반복하기
range와 함께 쓰기
for i in range(5):
print(i)
0, 1, 2, 3, 4가 찍혀요. range(5)는 0부터 5 앞까지의 숫자를 차례로 만들어 줘요. for는 그 숫자를 하나씩 i에 담아 블록을 실행해요.
| 쓰는 법 | 만들어지는 숫자 |
|---|---|
range(5) | 0, 1, 2, 3, 4 |
range(1, 6) | 1, 2, 3, 4, 5 |
range(0, 10, 2) | 0, 2, 4, 6, 8 |
range(5, 0, -1) | 5, 4, 3, 2, 1 |
묶음을 하나씩 꺼내기
for는 숫자뿐 아니라 문자열, 리스트처럼 여러 값이 든 것이면 무엇이든 하나씩 꺼낼 수 있어요.
for ch in "파이썬":
print(ch)
fruits = ["사과", "바나나", "포도"]
for fruit in fruits:
print(f"{fruit} 좋아요")
번호도 같이 필요하면 enumerate를 써요.
for idx, fruit in enumerate(fruits, start=1):
print(f"{idx}. {fruit}")
누적하기
반복문의 가장 흔한 쓰임은 값을 모으는 거예요.
total = 0
for n in range(1, 101):
total += n # total = total + n 과 같아요
print(total) # 5050
+= 같은 축약 연산자는 -=, *=, /=도 있어요.
while 반복문: 조건이 참인 동안 반복하기
for는 몇 번 반복할지 알 때, while은 언제 끝날지 모를 때 써요.
balance = 10000
months = 0
while balance < 20000:
balance = balance * 1.05 # 매달 5%씩 늘어난다면
months += 1
print(f"{months}개월 뒤 두 배가 됩니다.")
무한 반복 조심하기
count = 0
while count < 5:
print(count)
# count += 1 을 빼먹으면 영원히 0을 찍어요
조건을 바꾸는 코드를 빼먹으면 프로그램이 끝나지 않아요. 터미널에서 Ctrl + C를 누르면 강제로 멈출 수 있어요. while을 쓸 때는 "이 반복은 무엇 때문에 언젠가 끝나는가"를 늘 확인하세요.
break와 continue
break: 반복을 즉시 끝내요.continue: 이번 차례만 건너뛰고 다음 차례로 가요.
for n in range(1, 11):
if n % 2 == 0:
continue # 짝수는 건너뛰기
if n > 7:
break # 7보다 크면 그만
print(n) # 1, 3, 5, 7
while True와 break를 함께 쓰면 "원하는 입력이 들어올 때까지 계속 묻기" 같은 패턴을 만들 수 있어요.
while True:
answer = input("계속할까요? (y/n): ")
if answer in ("y", "n"):
break
print("y 또는 n으로 입력해 주세요.")
중첩: 반복 안의 반복
for dan in range(2, 10):
for n in range(1, 10):
print(f"{dan} x {n} = {dan * n}")
print("-" * 12)
바깥 반복이 한 번 돌 때 안쪽 반복은 처음부터 끝까지 다 돌아요. 구구단은 8 × 9 = 72번 출력돼요. 중첩이 깊어질수록 반복 횟수가 곱으로 늘어나니, 데이터가 커지면 속도를 생각해야 해요. 이 감각은 알고리즘 트랙의 복잡도 강의로 이어져요.
실습: 숫자 맞히기 게임
컴퓨터가 1부터 100 사이의 숫자를 하나 정하고, 사용자가 맞힐 때까지 "더 커요", "더 작아요"를 알려 주는 게임을 만들어 봐요.
import random
secret = random.randint(1, 100)
tries = 0
print("1부터 100 사이의 숫자를 맞혀 보세요!")
while True:
text = input("숫자: ")
if not text.isdigit():
print("숫자만 입력해 주세요.")
continue
guess = int(text)
tries += 1
if guess < secret:
print("더 커요.")
elif guess > secret:
print("더 작아요.")
else:
print(f"정답! {tries}번 만에 맞혔어요.")
break
새로 나온 것들을 짚어 볼게요.
import random: 파이썬에 기본으로 들어 있는 난수 도구를 불러와요. 모듈은 함수 강의에서 자세히 다뤄요.random.randint(1, 100): 1 이상 100 이하의 정수 하나를 뽑아요.text.isdigit(): 문자열이 숫자로만 되어 있는지 확인해요. 덕분에 "abc"를 입력해도 프로그램이 멈추지 않아요.
도전 과제
- 시도 횟수를 7번으로 제한하고, 넘으면 정답을 알려 주고 끝내 보세요.
- 게임이 끝나면 "한 판 더?"를 묻고, y면 새 숫자로 다시 시작하게 만들어 보세요.
- 매번 맞힐 수 있는 범위를 보여 주세요. 예를 들어 50을 불렀는데 더 크다면 "51 ~ 100 사이"처럼요.
생각해 볼 점 1부터 100 사이라면 최대 몇 번 만에 반드시 맞힐 수 있을까요? 매번 남은 범위의 한가운데를 부르면 7번이면 충분해요. 범위를 절반씩 줄이는 이 전략이 이진 탐색이고, 알고리즘 트랙에서 다시 만나요.
자주 하는 실수
- 콜론 빠뜨리기.
if,elif,else,for,while줄 끝에는 반드시:이 있어야 해요. - 들여쓰기 어긋남. 블록 안의 줄은 깊이가 정확히 같아야 해요.
- range의 끝값 착각.
range(1, 10)은 9까지예요. 10까지 원하면range(1, 11)이에요. - while 조건을 바꾸지 않음. 무한 반복의 가장 흔한 원인이에요.
- 반복 안에서 초기화. 합계 변수
total = 0을 반복 안에 두면 매번 0으로 돌아가요. 반복 밖, 위에 두세요.
점검 문제
range(3, 12, 3)이 만드는 숫자는?- 아래 코드는 무엇을 출력하나요?
x = 15
if x > 10:
print("A")
elif x > 5:
print("B")
else:
print("C")
- 1부터 50까지 3의 배수의 합을 구하는 코드를 for로 써 보세요.
break와continue의 차이를 한 문장씩 설명해 보세요.
정답
- 3, 6, 9. 12는 포함되지 않아요.
A만 출력돼요. 첫 조건이 참이라 나머지는 확인하지 않아요.- 예시:
total = 0
for n in range(1, 51):
if n % 3 == 0:
total += n
print(total) # 408
break는 반복 전체를 끝내고,continue는 이번 차례만 건너뛰고 다음 차례로 넘어가요.
다음 강의
다음 강의에서는 함수와 모듈을 배워요. 같은 코드를 여러 번 복사해 붙이고 있다면 함수로 만들 때가 된 거예요. 코드를 이름 붙은 부품으로 나누면 프로그램이 커져도 길을 잃지 않아요.