변수·조건·반복으로 상태 읽기
값의 변화와 if·for·while의 실행 순서를 추적합니다.
알고리즘은 답만 출력하는 마술이 아니라 상태를 바꾸는 순서입니다. 이 본문의 목표는 변수의 현재 값이 무엇인지 적으면서 조건과 반복을 읽는 것입니다. 첫 본문의 파일 실행만 준비하면 됩니다.
개념과 약속
변수는 값을 가리키는 이름입니다. count = count + 1은 수학의 등식이 아니라, 오른쪽을 현재 값으로 계산한 뒤 새 값을 연결하는 대입입니다. ==는 같은지 비교하고 =는 대입합니다. if는 참일 때 들여쓴 코드를 실행합니다. for는 순서대로 원소를 꺼내고, while은 조건이 참인 동안 반복합니다.
range(5)는 0, 1, 2, 3, 4입니다. 끝 5를 포함하지 않는 반열린 범위를 기억하세요. range(1, 6)은 1부터 5까지입니다. 같은 블록은 같은 수의 공백으로 들여씁니다. Python에서는 이 들여쓰기가 문장 묶음을 결정합니다.
손으로 상태 추적하기
| 꺼낸 n | n이 홀수인가 | 누적 total | 누적 count |
|---|---|---|---|
| 1 | 참 | 1 | 1 |
| 2 | 거짓 | 1 | 1 |
| 3 | 참 | 4 | 2 |
| 4 | 거짓 | 4 | 2 |
| 5 | 참 | 9 | 3 |
n % 2는 2로 나눈 나머지입니다. 나머지가 1이면 이 범위의 양의 정수는 홀수입니다.
직접 실행하기
아래 코드는 이 본문만으로 실행할 수 있습니다. lesson.py로 저장하고 첫 장에서 확인한 Python 명령으로 실행하세요.
total = 0
count = 0
for n in range(1, 6):
if n % 2 == 1:
total += n
count += 1
print(total, count)
remaining = 3
while remaining > 0:
print(remaining)
remaining -= 1실행 결과:
9 3
3
2
1왜 맞고 언제 끝나는가
반복이 한 원소를 처리할 때마다 total은 지금까지 본 홀수의 합이고 count는 그 개수입니다. 이 사실이 각 단계에서 유지됩니다. for는 다섯 원소가 끝나면 종료합니다. 아래 while에서는 remaining이 매번 1씩 줄어 0이 되므로 끝납니다.
비용과 적용 범위
범위 끝을 n으로 늘리면 검사 횟수가 n에 비례합니다. 여기서 %, 비교, 작은 정수 덧셈을 한 단계로 세는 간단한 모델을 사용합니다. 값을 계속 복사해 별도 목록을 만들지 않아 변수 개수는 일정합니다.
스스로 풀어 보기
- 범위를
range(1, 8)로 바꾸면 합과 개수는 무엇인가요? remaining -= 1을 지우면 무엇이 달라지나요? 실행하기 전 종료 여부부터 판단하세요.
힌트
- 7을 포함하며 새 홀수는 7입니다.
while조건을 바꾸는 값이 있는지 살핍니다.
해설
- 홀수 1, 3, 5, 7의 합은 16이고 개수는 4입니다.
remaining이 3에 머물러 반복이 끝나지 않습니다. 실수로 실행했다면 터미널의Ctrl+C로 중단할 수 있습니다.
흔한 오해
range의 끝값도 실행한다고 생각하면 개수를 하나 더 세게 됩니다. 한 번도 반복하지 않는 range(0)과 처음부터 거짓인 while도 정상적인 경계 입력입니다.
복습과 다음 연결
다음 절에서는 함수와 리스트로 이 반복을 다시 쓸 수 있는 단위로 묶습니다.