4회차: 반복문
4회차: 반복문
선수 학습: 3회차 (조건문)
학습 목표
- 반복문의 개념을 이해한다.
for반복문을 사용할 수 있다.while반복문을 사용할 수 있다.range()함수를 다양하게 활용할 수 있다.break/continue로 반복을 제어할 수 있다.
4.1. 반복문이란?
4.1.1. 왜 반복문이 필요한가?
“안녕하세요”를 5번 출력하고 싶다면 아래처럼 5줄을 써야 한다.
1print("안녕하세요")2print("안녕하세요")3print("안녕하세요")4print("안녕하세요")5print("안녕하세요")만약 100번이라면 100줄을 써야 한다. 이것은 매우 비효율적이다. 반복문(Loop)을 사용하면 이런 반복 작업을 코드 몇 줄로 해결할 수 있다.
1for i in range(5):2 print("안녕하세요")4.1.2. 반복문의 종류
파이썬에서는 두 가지 반복문을 사용한다.
for(포): 정해진 횟수나 목록의 끝까지 반복while(와일): 조건이 참(True)인 동안 반복
4.2. for(포) 반복문
4.2.1. for 의 구조
1for 변수 in 반복대상:2 반복할 코드반복대상 에서 값을 하나씩 꺼내어 변수 에 저장하고, 들여쓰기된 코드를 실행한다. 반복대상의 모든 값을 꺼낼 때까지 반복한다.
4.2.2. 리스트를 이용한 for 반복
1fruits = ["사과", "바나나", "포도", "딸기"]2
3for f in fruits:4 print(f)| 줄 | 설명 |
|---|---|
| 1 | 과일 이름이 담긴 리스트를 선언한다. |
| 3 | 첫 번째 반복: f = "사과" |
| 3 | 두 번째 반복: f = "바나나" |
| 3 | 세 번째 반복: f = "포도" |
| 3 | 네 번째 반복: f = "딸기" |
| 4 | 각 반복마다 f 의 값을 출력한다. |
실행 결과
1사과2바나나3포도4딸기4.2.3. 반복마다 번호 붙이기
enumerate(에뉴머레이트) 함수를 사용하면 반복할 때 순서 번호도 함께 얻을 수 있다.
1fruits = ["사과", "바나나", "포도"]2
3for i, f in enumerate(fruits):4 print(f"{i + 1}. {f}")| 줄 | 설명 |
|---|---|
| 3 | enumerate(fruits) 는 (0, "사과"), (1, "바나나"), (2, "포도") 를 순서대로 반환한다. i 는 순서 번호, f 는 값이다. |
| 4 | 번호는 0부터 시작하므로 i + 1 을 출력하여 1번부터 표시한다. |
실행 결과
11. 사과22. 바나나33. 포도4.3. range(레인지) 함수
4.3.1. range 란?
range() 함수는 정해진 범위의 숫자들을 순서대로 만들어낸다. for 반복문과 함께 자주 사용한다.
4.3.2. range 사용 방법
| 사용 방법 | 생성되는 숫자 | 설명 |
|---|---|---|
range(5) | 0, 1, 2, 3, 4 | 0부터 4까지 |
range(1, 6) | 1, 2, 3, 4, 5 | 1부터 5까지 |
range(0, 10, 2) | 0, 2, 4, 6, 8 | 0부터 8까지 2씩 증가 |
range(10, 0, -1) | 10, 9, 8, …, 1 | 10부터 1까지 1씩 감소 |
참고
range(1, 6) 에서 마지막 숫자 6 은 포함되지 않는다. 1부터 시작하여 6 이 되기 직전인 5 에서 끝난다.
4.3.3. range 기본 예시
1for i in range(5):2 print(i)| 줄 | 설명 |
|---|---|
| 1 | range(5) 는 0, 1, 2, 3, 4 를 만든다. |
| 2 | 각 반복마다 i 의 값을 출력한다. |
실행 결과
10213243544.3.4. 1부터 시작하기
1for i in range(1, 6):2 print(f"{i}번째 반복")| 줄 | 설명 |
|---|---|
| 1 | range(1, 6) 은 1, 2, 3, 4, 5 를 만든다. |
| 2 | 각 반복마다 몇 번째인지 출력한다. |
실행 결과
11번째 반복22번째 반복33번째 반복44번째 반복55번째 반복4.3.5. 증가 폭 설정하기
1print("짝수만 출력:")2for i in range(0, 11, 2):3 print(i)4
5print("카운트다운:")6for i in range(5, 0, -1):7 print(i)8print("발사!")| 줄 | 설명 |
|---|---|
| 2 | range(0, 11, 2) 는 0부터 10까지 2씩 증가하며 0, 2, 4, 6, 8, 10 을 만든다. |
| 6 | range(5, 0, -1) 는 5부터 1까지 1씩 감소하며 5, 4, 3, 2, 1 을 만든다. |
실행 결과
1짝수만 출력:20324456687108카운트다운:9510411312213114발사!4.3.6. 예제: 구구단 출력
1n = int(input("출력할 단을 입력하세요: "))2
3print(f"===== {n}단 =====")4for i in range(1, 10):5 print(f"{n} × {i} = {n * i}")| 줄 | 설명 |
|---|---|
| 1 | 사용자에게 단(n)을 입력받는다. |
| 3 | 구분선과 제목을 출력한다. |
| 4 | i 가 1부터 9까지 반복된다. |
| 5 | 각 반복마다 곱셈 결과를 출력한다. {n * i} 에서 n * i 가 자동 계산된다. |
4.4. for 반복문과 조건문 결합
for 반복문 안에 if 조건문을 넣으면 특정 조건을 만족하는 경우에만 실행할 수 있다.
1numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]2
3print("짝수 목록:")4for n in numbers:5 if n % 2 == 0:6 print(n)| 줄 | 설명 |
|---|---|
| 1 | 1부터 10까지의 숫자 리스트를 선언한다. |
| 4 | 리스트의 각 숫자를 차례대로 n 에 담는다. |
| 5 | n % 2 == 0 이면 (짝수이면) 아래 코드를 실행한다. |
| 6 | 짝수인 경우에만 출력한다. |
실행 결과
1짝수 목록:223446586104.5. while(와일) 반복문
4.5.1. while 의 구조
while 은 조건이 True 인 동안 계속 반복한다. 조건이 False 가 되는 순간 반복을 멈춘다.
1while 조건:2 반복할 코드4.5.2. while 기본 예시
1count = 02
3while count < 5:4 print(f"count = {count}")5 count += 16
7print("반복 종료")| 줄 | 설명 |
|---|---|
| 1 | count 를 0 으로 초기화한다. |
| 3 | count < 5 이면 반복한다. 처음에는 0 < 5 이므로 True 이다. |
| 4 | count 의 현재 값을 출력한다. |
| 5 | count += 1 로 count 를 1 증가시킨다. 이 줄이 없으면 count 가 영원히 0이어서 무한 반복이 된다. |
| 6 | count 가 5가 되면 5 < 5 는 False 이므로 반복이 종료된다. |
| 8 | while 블록 밖이므로 반복이 끝난 뒤 실행된다. |
실행 결과
1count = 02count = 13count = 24count = 35count = 46반복 종료주의
while 을 사용할 때는 반드시 반복이 언젠가 끝날 수 있도록 조건을 바꾸는 코드를 작성해야 한다. 그렇지 않으면 프로그램이 영원히 실행되는 무한 루프(Infinite Loop) 가 발생한다. 무한 루프가 발생하면 터미널에서 Ctrl + C 를 눌러 강제 종료할 수 있다.
4.5.3. 예제: 몬스터 체력 감소
1hp = 1002cnt = 03
4while hp > 0:5 hp -= 156 cnt += 17 print(f"공격 {cnt}회 | 남은 HP: {max(hp, 0)}")8
9print(f"총 {cnt}회 공격으로 몬스터 처치!")| 줄 | 설명 |
|---|---|
| 1~2 | 체력과 공격 횟수를 초기화한다. |
| 4 | hp > 0 이면 계속 반복한다. |
| 5 | 매 반복마다 체력을 15씩 감소시킨다. |
| 6 | 공격 횟수를 1씩 증가시킨다. |
| 7 | max(hp, 0) 는 hp 와 0 중 큰 값을 반환하므로 체력이 음수로 표시되지 않는다. |
| 9 | 반복이 끝나면 총 공격 횟수를 출력한다. |
실행 결과
1공격 1회 | 남은 HP: 852공격 2회 | 남은 HP: 703공격 3회 | 남은 HP: 554공격 4회 | 남은 HP: 405공격 5회 | 남은 HP: 256공격 6회 | 남은 HP: 107공격 7회 | 남은 HP: 08총 7회 공격으로 몬스터 처치!4.5.4. while을 이용한 입력 반복
사용자가 올바른 값을 입력할 때까지 계속 요청할 수 있다.
1while True:2 age = int(input("나이를 입력하세요 (1~120): "))3 if 1 <= age <= 120:4 print(f"입력된 나이: {age}세")5 break6 else:7 print("올바른 나이를 입력하세요.")| 줄 | 설명 |
|---|---|
| 1 | while True 는 조건이 항상 True 이므로 break 를 만날 때까지 무한 반복한다. |
| 2 | 나이를 입력받는다. |
| 3 | 1 <= age <= 120 은 나이가 1 이상이고 120 이하인지 검사한다. |
| 5 | 조건이 충족되면 break 로 반복을 종료한다. |
| 7 | 조건이 충족되지 않으면 다시 입력을 요청한다. |
4.6. break(브레이크) & continue(컨티뉴)
4.6.1. break — 반복 완전 종료
break 를 만나면 반복문 전체를 즉시 종료한다.
1for i in range(1, 11):2 if i == 5:3 print("5에서 멈춤!")4 break5 print(i)6
7print("for문 종료")| 줄 | 설명 |
|---|---|
| 1 | i 가 1부터 10까지 반복한다. |
| 2~4 | i 가 5가 되면 메시지를 출력하고 break 로 반복 전체를 즉시 종료한다. |
| 5 | break 가 실행되면 이 줄은 실행되지 않는다. |
| 7 | for 문이 종료된 후 실행된다. |
실행 결과
1122334455에서 멈춤!6for문 종료4.6.2. continue — 이번 반복만 건너뜀
continue 를 만나면 이번 반복의 남은 코드를 건너뛰고 다음 반복으로 넘어간다. 반복 자체는 종료되지 않는다.
1for i in range(1, 11):2 if i % 2 == 0:3 continue4 print(i)| 줄 | 설명 |
|---|---|
| 2~3 | i 가 짝수이면 continue 로 print(i) 를 건너뛰고 다음 반복으로 간다. |
| 4 | 홀수인 경우에만 이 줄이 실행된다. |
실행 결과
11233547594.6.3. break 와 continue 비교
| 키워드 | 동작 |
|---|---|
break | 반복문 전체 를 즉시 종료한다. |
continue | 이번 반복 의 남은 코드만 건너뛰고, 다음 반복은 계속한다. |
4.7. 중첩 반복문
반복문 안에 또 다른 반복문을 넣을 수 있다. 이를 중첩 반복문이라 한다.
1for i in range(1, 4):2 for j in range(1, 4):3 print(f"({i}, {j})", end=" ")4 print()| 줄 | 설명 |
|---|---|
| 1 | 바깥쪽 for 문: i 가 1, 2, 3 을 순서대로 취한다. |
| 2 | 안쪽 for 문: i 하나마다 j 가 1, 2, 3 을 반복한다. |
| 3 | end=" " 는 출력 후 줄바꿈 대신 공백을 넣는다. |
| 4 | print() 는 빈 줄을 출력한다. 안쪽 반복이 끝날 때마다 줄을 바꾼다. |
실행 결과
1(1, 1) (1, 2) (1, 3)2(2, 1) (2, 2) (2, 3)3(3, 1) (3, 2) (3, 3)4.7.2. 예제: 전체 구구단 출력
1for i in range(2, 10):2 print(f"===== {i}단 =====")3 for j in range(1, 10):4 print(f"{i} × {j} = {i * j}")5 print()| 줄 | 설명 |
|---|---|
| 1 | 바깥 반복: i 가 2부터 9까지 반복한다. (2단~9단) |
| 2 | 각 단의 제목을 출력한다. |
| 3~4 | 안쪽 반복: j 가 1부터 9까지 반복하며 곱셈 결과를 출력한다. |
| 5 | 각 단이 끝날 때마다 빈 줄을 출력한다. |
4.8. 실습 과제
과제 1. 별 피라미드 출력
아래와 같은 별 피라미드를 출력하는 코드를 작성한다.
1*2**3***4****5*****1for i in range(1, 6):2 print("*" * i)과제 2. 로또 번호 합산기
1~45 사이의 로또 번호 6개를 input() 으로 입력받아 합계와 평균을 계산하여 출력한다.
1total = 02
3print("로또 번호 6개를 입력하세요.")4for i in range(1, 7):5 n = int(input(f"{i}번째 번호: "))6 total += n7
8avg = total / 69print(f"\n합계: {total}")10print(f"평균: {avg:.1f}")과제 3. 3의 배수의 합
1부터 100까지의 숫자 중 3의 배수의 합과 개수를 구하여 출력한다.
1total = 02cnt = 03
4for i in range(1, 101):5 if i % 3 == 0:6 total += i7 cnt += 18
9print(f"3의 배수 개수: {cnt}개")10print(f"3의 배수의 합: {total}")