[파이썬 개념 6] 반복문
같은 일을 여러 번 하는 것은 컴퓨터가 가장 잘하는 일입니다. 반복은 반복문으로 표현합니다.
파이썬에는 for 와 while 두 가지 반복문이 있고, 반복문으로 하는 일에는 몇 가지 정해진 패턴이 있습니다.
1. for 와 range
for i in range(5):
print("반복", i)
실행 결과
반복 0
반복 1
반복 2
반복 3
반복 4
range(5) 는 0, 1, 2, 3, 4 를 차례로 만들고, for 는 그 수를 하나씩 i 에 넣으며 블록을 실행합니다.
조건문처럼 콜론과 들여쓰기를 지킵니다. i 는 다른 이름이어도 됩니다.
range 의 세 가지 모양
| 모양 | 만드는 수 | 개수 |
|---|---|---|
range(끝) |
0 ~ 끝-1 | 끝 |
range(시작, 끝) |
시작 ~ 끝-1 | 끝-시작 |
range(시작, 끝, 간격) |
시작부터 간격씩 |
print(list(range(5)))
print(list(range(1, 6)))
print(list(range(1, 10, 2)))
print(list(range(10, 0, -3)))
실행 결과
[0, 1, 2, 3, 4]
[1, 2, 3, 4, 5]
[1, 3, 5, 7, 9]
[10, 7, 4, 1]
끝 수는 포함하지 않습니다. 1부터 n까지는
range(1, n + 1)입니다.
리스트와 문자열도 반복할 수 있다
for 는 range 뿐 아니라 값이 여러 개 들어 있는 것이면 무엇이든 하나씩 꺼냅니다.
for name in ["푸름", "소담", "보람"]:
print(name, "출석")
for ch in "abc":
print(ch, end=" ")
실행 결과
푸름 출석
소담 출석
보람 출석
a b c
2. 반복문의 실행 과정 추적하기
total = 0
for i in range(1, 5):
total += i
print(i, total)
print("결과", total)
실행 결과
1 1
2 3
3 6
4 10
결과 10
| 차례 | i | total += i 후 total |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 3 |
| 3 | 3 | 6 |
| 4 | 4 | 10 |
중간에 print 를 넣어 값이 어떻게 변하는지 보는 것은 반복문을 이해하는 가장 좋은 방법입니다. 다 확인한 뒤에 지우면 됩니다.
3. 반복 패턴 다섯 가지
반복문으로 하는 일은 대부분 다음 다섯 가지 중 하나이거나 그 조합입니다.
패턴 1: 합계
nums = [3, 8, 2, 7]
total = 0 # 밖에서 0으로 시작
for x in nums:
total += x # 안에서 더하기
print(total) # 끝나고 출력
실행 결과
20
패턴 2: 개수 세기
nums = [3, 8, 2, 7, 10]
count = 0
for x in nums:
if x % 2 == 0: # 조건에 맞을 때만
count += 1
print(count)
실행 결과
3
패턴 3: 곱 누적
n = 5
result = 1 # 곱하기는 1에서 시작
for i in range(1, n + 1):
result *= i
print(result)
실행 결과
120
패턴 4: 최댓값, 최솟값
nums = [72, 95, 88, 60]
best = nums[0] # 첫 값을 일단 최댓값으로
for x in nums:
if x > best:
best = x
print(best)
실행 결과
95
패턴 5: 찾으면 표시하기
nums = [3, 8, 2, 7]
found = False
for x in nums:
if x == 2:
found = True
print(found)
실행 결과
True
found 처럼 참과 거짓으로 상태를 기억하는 변수를 깃발 변수라고 부릅니다.
세 자리를 꼭 지키자
| 자리 | 하는 일 | 잘못 두면 |
|---|---|---|
| 반복문 밖, 위 | 처음 값 정하기 | 안에 두면 매번 처음으로 돌아감 |
| 반복문 안 | 쌓기, 세기, 비교하기 | |
| 반복문 밖, 아래 | 결과 출력 | 안에 두면 중간 결과가 모두 출력됨 |
total = 0
for i in range(1, 4):
total += i
print(total)
실행 결과
1
3
6
print 가 안에 있어서 중간 결과까지 출력되었습니다. 들여쓰기 한 칸 차이로 결과가 달라집니다.
4. 반복문 안의 조건문
for i in range(1, 16):
if i % 15 == 0:
print("짝쿵", end=" ")
elif i % 3 == 0:
print("짝", end=" ")
elif i % 5 == 0:
print("쿵", end=" ")
else:
print(i, end=" ")
실행 결과
1 2 짝 4 쿵 짝 7 8 짝 쿵 11 짝 13 14 짝쿵
5. while
조건이 참인 동안 반복합니다. 몇 번 반복할지 미리 알 수 없을 때 씁니다.
money = 0
month = 0
while money < 10000:
money += 3000
month += 1
print(month, money)
print(month, "달 걸림")
실행 결과
1 3000
2 6000
3 9000
4 12000
4 달 걸림
동작 순서는 이렇습니다.
- 조건을 검사한다. 거짓이면 반복을 끝낸다.
- 참이면 블록을 실행한다.
- 다시 1로 돌아간다.
처음부터 조건이 거짓이면 한 번도 실행되지 않습니다.
무한 반복 주의
조건이 언젠가 거짓이 되도록 블록 안에서 값을 바꾸어야 합니다. 그렇지 않으면 끝나지 않습니다.
채점 사이트에서는 시간 초과로 나타납니다.
n = 10
while n > 0:
print(n)
# n -= 1 을 빠뜨리면 n 은 계속 10 → 끝나지 않는다
6. break 와 continue
break: 반복을 그 자리에서 끝낸다.continue: 이번 차례의 나머지를 건너뛰고 다음 차례로 간다.
while True:
x = int(input())
if x == 0:
break
print(x * 2)
print("끝")
입력
3
5
0
실행 결과
6
10
끝
while True: 는 끝나지 않는 반복이지만 break 로 빠져나옵니다. "0이 나올 때까지", "정답을 맞힐 때까지" 같은 문제에서 씁니다.
for i in range(1, 11):
if i % 3 == 0:
continue
print(i, end=" ")
실행 결과
1 2 4 5 7 8 10
7. 중첩 반복문
반복문 안에 반복문을 넣으면 표나 도형을 만들 수 있습니다. 바깥이 한 번 돌 때 안쪽은 처음부터 끝까지 다 돕니다.
for i in range(1, 4):
for j in range(1, 4):
print(f"{i}x{j}={i * j}", end=" ")
print()
실행 결과
1x1=1 1x2=2 1x3=3
2x1=2 2x2=4 2x3=6
3x1=3 3x2=6 3x3=9
n = 4
for i in range(1, n + 1):
print("*" * i)
실행 결과
*
**
***
****
8. for 와 while 고르기
| 상황 | 알맞은 반복문 | 예 |
|---|---|---|
| 반복 횟수를 안다 | for |
1부터 n까지, 학생 수만큼, 리스트의 모든 값 |
| 끝나는 조건만 안다 | while |
목표 금액이 될 때까지, 0이 나올 때까지 |
for 로 쓸 수 있는 것은 while 로도 쓸 수 있지만, 횟수를 알 때는 for 가 짧고 실수가 적습니다.
i = 1
while i <= 5:
print(i, end=" ")
i += 1
실행 결과
1 2 3 4 5
정리
for i in range(시작, 끝, 간격):끝은 포함하지 않는다.- 반복 패턴: 합계, 개수, 곱, 최댓값/최솟값, 깃발.
- 처음 값은 밖 위에, 쌓기는 안에, 출력은 밖 아래에.
while 조건:은 참인 동안 반복한다. 조건이 거짓이 되게 값을 바꾼다.break는 끝내기,continue는 이번만 건너뛰기.
확인 문제
range(2, 11, 3)이 만드는 수를 모두 쓰세요.- 다음 코드의 출력은?
count = 0 for i in range(10): if i % 4 == 0: count += 1 print(count) - 1부터 차례로 더해서 합이 처음으로 100을 넘는 순간의 수를 구하려고 합니다.
for와while중 무엇이 알맞나요?
연습해 보기
- 1051 1부터 n까지 출력
- 1054 1부터 n까지의 합
- 1055 배수의 개수와 합
- 1056 최고 기록
- 1059 저금통
- 1063 구구단
- 1070 늘어나는 삼각형
- 1121 팩토리얼
- 1124 업다운 게임
- 1125 통통 튀는 공
확인 문제 정답
2, 5, 8(11은 포함하지 않음)3: 0, 4, 8 이 4로 나누어떨어집니다.while: 몇 번 더해야 할지 미리 알 수 없기 때문입니다.
댓글 0
로그인하면 댓글을 쓸 수 있습니다.