방송대 파이썬 프로그래밍 기초 - 7강. 반복구조
1. 반복구조의 정의
반복 구조의 개념
• 프로그래밍 언어는 똑같은 일을 반복하지 않도록 다양한 구조와 개념을 제공함.
• 반복구조 : 특정 영역의 명령문을 여러 번 실행하는 구조
- 반복 횟수를 조건에 따라 결정
- loop, iterate, repeat 용어가 혼용됨. [참고, 수업X]
Loop(루프) | 반복문, 일정한 조건을 만족하는 동안 코드 블록이 반복해서 실행되는 제어 구조 파이썬에서는 for 루프와 while 루프 두 가지의 반복문이 제공됨. |
Iterate(이터레이트) | 리스트, 튜플, 딕셔너리 등의 각 요소를 순차적으로 접근하면서 반복적으로 처리하는 행위 주로 for 루프와 함께 사용되며, 컬렉션의 각 요소를 한 번에 하나씩 처리하는 방식으로 동작함. |
Repeat(리피트) | 일정한 조건을 만족하거나 특정한 횟수만큼 작업을 반복하는 것 ex. 5번 반복해서 작업을 실행하라 → repeat 10 times |
반복 출력 프로그램
'저는 파이썬을 잘 다룰 수 있습니다'를 5번 출력하는 프로그램을 작성하시오.
반복 구조의 구문형식
조건 제어 반복 | 계수 제어 반복 |
![]() |
![]() |
조건을 통해 반복 여부를 매번 판단 | 반복 횟수를 미리 제시 |
![]() |
![]() |
<= 3 → 3까지 | range(1,4) → 1부터 4 미만(3까지) |
• 계수 제어 반복 구조에서 특정 반복 횟수와 반복 시 계수의 값을 정하기 위해 사용하는 데이터 타입 => 시퀀스
• range 함수로 생성된 객체는 값들이 연속적으로 이어진 형태를 가진 시퀀스 자료임. [참고]
ex. range(1, 4) : 1부터 4 미만까지의 정수가 연속적으로 이어진 시퀀스 자료형
- for 루프에서 반복(iterate)하면서 count라는 변수에 각각의 값을 할당하여 사용할 수 있음.
- range 객체는 인덱스로 접근하거나 슬라이싱을 사용할 수 없지만, 반복을 통해 시퀀스의 각 값에 접근할 수 있음.
반복 구조의 실행흐름
while문은 if문과 다르게 반복횟수가 다 찰 때까지 계속 반복함.
그런데 만약 count 변수의 값을 하나씩 증가시켜 주는 문장을 빼먹는다면?
반복횟수가 정해지지 않으니 무한대로 반복함.
→ 반복 구조를 사용할 때에는 종료가 되는지 꼭 판단해야 함.
센티널(Sentinel)
• 특정 값을 사용하여 반복문이나 루프를 제어하는 데 사용되는 값
• 센티널 값이 나타날 때까지 반복을 계속하다가 센티널 값이 나타나면 반복을 종료하는 용도로 사용됨.
• 숫자, 문자열, 불리언 등 다양한 데이터 타입의 값을 사용할 수 있음.
• while 문의 조건식에 True → 무한 루프
- while 문의 조건식은 불리언(Boolean) 값(True, False)을 가져야 함.
- 조건식이 항상 True이기 때문에 while 문은 계속해서 반복됨.
- 만약 while 문의 조건식을 생략하면, 기본적으로 True로 간주되어 무한 루프가 생성됨.
반복 구조 설계 전략
단계 1 | 반복되어야 하는 명령 블록을 작성 |
단계 2 | 반복되어야 하는 명령문을 다음과 같이 반복 구조로 작성 while True: 명령 블록 |
단계 3 | 반복-계속-조건을 작성하고 반복 구조를 제어하기 위해 반복 제어 명령문을 추가 while 반복-계속-조건: 명령 블록 반복 제어 명령문 |
반복 구조 설계 전략 적용
1 | sum = sum + i | • 반복되어야 할 것이 무엇인가? - 누적시킬 변수 sum에 현재 누적값과 반복횟수(i) 더하기 |
2 | while True: sum = sum + i |
• 1번의 명령문을 반복 구조 안에 작성함. - True일 때 기존 누적값과 횟수를 더함. |
3 | sum = 0 i = 1 last = input("어디까지 더할까요?: ") while i <= last: sum = sum + i i = i + 1 |
• sum을 0으로 초기화하기 (sum에는 쓰레기값이 있으므로 초기화를 해야됨.) • 종결조건은 True에 작성 • 반복제어 명령문을 추가함. |
n까지 합 계산 프로그램
![]() |
![]() |
while문 바깥에 print(sum) → sum의 최종값이 출력됨. |
while문 안에 print(sum) → 반복되는 횟수마다 sum값이 출력됨. |
반복구조 설계 전략에 따라 만들기
1. 반복되어야 할 것이 무엇인가?
반복하게 될 값 : n번째까지 수의 합인 sum
반복 횟수인 i값도 하나씩 증가함.
2. 1번의 명령문을 반복 구조(while True) 안에 작성함.
3. 사용자에게 값을 받기 위한 문장 써줌.
4. 변수 sum은 꼭 초기화를 해주어야 됨.
5. 종결조건은 True 부분에 작성, 반복 제어 명령문 추가
2. 리스트
리스트의 개념
• 순서화된 값의 집합체를 저장할 수 있는 데이터 타입
• 단일 식별자로 연속된 저장 공간 접근 수단 제공, 중복된 값 가질 수 있음
• 개별 원소의 값을 수정, 추가, 삭제 가능 (변경 가능)
• 원소(element)의 나열을 저장할 수 있는 시퀀스 타입 중 하나
※ 시퀀스 자료형(sequence types) :
리스트, 튜플, range, 문자열처럼 값이 연속적으로 이어진 자료형
리스트, 세트, 튜플, 딕셔너리 [참고]
특징 | 순서 여부 | 중복 허용 | 수정 가능 | 예시 | |
리스트(List) | 값들의 배열 | O | O | O | [1, 2, 3, 4, 5] |
세트(Set) | 값들의 집합 | X | X | O | {1, 2, 3, 4, 5} |
튜플(Tuple) | 값들의 배열 | O | O | X | (1, 2, 3, 4, 5) |
딕셔너리(Dictionary) | 키 값 쌍의 집합 | X | X | O | {'a': 1, 'b': 2, 'c': 3} |
리스트의 구성
• 변수(Variable)
- 값에 대한 이름을 가리키는 식별자(identifier)
- 리스트는 변수에 할당될 수 있음.
ex. my_list = [1, 2, 3] → 리스트를 변수 my_list에 할당함.
• 참조변수(Reference Variable)
- 파이썬에서 변수에 값을 할당할 때, 실제로는 값을 복사하지 않고 해당 값의 위치(메모리 주소)를 참조하는 변수
ex. my_list = [1, 2, 3] → my_list는 실제로는 리스트 [1, 2, 3]의 위치를 가리키는 참조변수
• 리스트 객체(List Object)
- 객체는 객체 지향 프로그래밍에서 모든 걸 다 객체라고 함.
- 파이썬에서 리스트는 객체로 존재함. / 저장공간(X), 리스트 객체(O)
리스트의 구문형식
• 여러 개의 원소 타입도 하나의 리스트로 묶을 수 있음.
ex. my_list = [1, 2.3, "hello", True]
리스트의 사용법 [참고, 시험 X]
인덱스 연산자
• 시퀀스 타입의 원소에 접근하는 연산자로, 접근 연산자 [ ] 사용
• 원소에 부여된 인덱스 번호로 지칭
파이썬을 포함한 많은 언어들이 연속된 집합체를 제공하고 있음.
→ 연산자에 익숙해진다면 파이썬을 통해 다른 프로그래밍 언어에도 쉽게 다가갈 수 있음.
계수 제어 반복의 사용
• 구문형식
- 계수-제어 변수와 시퀀스 사용
- 반복 시 계수-제어-변수에 시퀀스의 원소 할당
• 계수 제어 반복의 가장 큰 특징 : 저장 공간의 개수만큼 반복을 한다
• 파이썬에서는 리스트를 이용한 for문을 자주 사용한다
- 리스트의 길이에 따라 자동으로 반복되므로, 개발자가 직접 반복 인덱스를 관리하거나 길이를 확인하는 등의 작업을 하지 않아도 됨.
3. 반복 구조의 확장
리스트 생성 자동화
• 리스트 내 원소에 규칙성이 있는 경우 생성 자동화를 위해 함수 사용 가능
• range(a, b, k) :
- 반복문에서 특정 범위 내에서 일정 간격으로 반복 작업을 할 수 있는 내장함수
- a부터 b-1(b보다 작은 값)까지의 범위에서 k의 간격으로 시퀀스 생성
- a, b, k는 정수형(O), 부동소수점(X)
a | 시작 범위를 나타내는 정수, 범위에 포함(O) a를 생략하는 경우 기본값으로 0부터 시작함. |
b | 종료 범위를 나타내는 정수, 범위에 포함(X) 실제로 생성되는 숫자는 b-1까지의 범위 |
k | 생성되는 숫자 간의 간격, 0이나 음수도 가능함. k를 생략하는 경우 기본값으로 1씩 증가함. |
• range 함수의 사용
range(1, 100, 1) range(1, 100) 1에서 99까지 1씩 증가함. |
rad_list = range(10, 40, 10) 10부터 40미만까지 10씩 증가함. |
![]() |
![]() |
사진 출처 : 강의록
반복 출력 프로그램을 개선할 수 있음.
중첩 반복 구조
• 반복 구조 내 다른 반복구조를 내포한 형태
• 선택구조 안에 또다른 선택구조가 있는 것처럼 반복 구조 안에도 또 다른 반복을 포함시킬 수 있음.
구문형식 | 실행 흐름 |
![]() |
![]() |
위 사진 속 코드는 range를 사용하여 변수 i, j, k가 0부터 999까지 1씩 증가하는 걸 알 수 있음.
i, j, k를 동시에 곱하니까 1000 x 1000 x 1000이 되므로 결과가 10억개 출력된다. (교수님 피셜 50초 걸린다고 함)
중첩 반복 구조를 사용할 때 반복 횟수가 급격히 증가할 수 있으므로 작성시 주의해야 함.
format 함수
• 데이터를 양식에 맞춰 형식화하는 함수
> | 정렬방향 (왼쪽에서 오른쪽으로) 문자 타입은 왼쪽 정렬이, 정수 타입은 우측 정렬이 기본임. |
10 | 필드의 폭을 의미함. ex. "99단표"라는 문자는 총 4칸을 차지함. → 앞에 6칸 비워놓고 4칸만 씀. |
S | 데이터 타입이 문자라는 뜻 (d: 정수, s: 문자열) |
• format() 함수를 사용하여 문자열 포맷팅
- 원래의 문자열을 수정하는 것이 아니라 포맷팅된 새로운 문자열을 반환하므로, 원본 문자열이 변경되지 않음.
→ 포맷팅한 결과를 별도로 출력해야됨.
4. 원뿔 계산 프로그램 개선
기존의 프로그램은 반지름, 높이를 각각 입력 받아서 계산하는 구조였음.
그렇지만 이번에 만들고 싶은 프로그램은 반지름은 고정, 높이는 여러 가지 수치를 입력 받아서 계산하는 것.
1. 반지름은 고정, 높이는 여러 가지 숫자
→ for ~ in을 사용한 계수-제어 반복문 사용
리스트의 원소를 하나씩 출력하는 for 반복문을 만들어 각 결과가 출력되도록 한다.
2. 반지름과 높이도 각각 다른 숫자로 넣고 싶음.
높이 : 1, 5, 14로 불규칙 → 리스트를 만들자
반지름 : 10, 20, 30로 규칙 → 자동화하여 리스트를 만들 수 있음
for문이 반복할 때마다 반지름, 높이 두 변수가 한꺼번에 바뀌는 상황
위 식은 문제에서 원하는대로 작성된 것이 아님.
문제는 (10, 1), (20, 5), (30, 14)인 세 가지 경우에 대해서만 결과값을 출력하는 걸 원했음.
→ zip 함수를 사용하여 필요한 원소를 하나씩 꺼내서 사용할 수 있음.
zip함수 [참고, 수업X]
• 여러 개의 리스트를 하나씩 엮어서 가져오는 기능을 제공하는 함수
- 각 리스트에서 같은 인덱스의 값들을 묶어서 튜플의 형태로 반환함.
- 두 개의 리스트를 엮을 때, 두 리스트의 길이가 다를 경우에는 zip() 함수가 동작하지 않고 오류가 발생함.
→ 길이가 다르면 길이가 더 짧은 리스트에 맞춰서 처리하거나, itertools.zip_longest() 함수를 사용함.
• zip() 함수는 iterable한 객체를 반환하는데, 이 객체는 실제로 값을 가지지 않고 iterator로서 동작함.
→ print(zipped)와 같이 zip() 함수를 직접 출력하면 오류가 발생할 수 있음.
• zipped 객체의 내용을 확인하고 싶을 경우
→ list() 함수나 for 루프 등을 사용하여 zip() 객체를 순회(iterate)하면서 값을 확인할 수 있음.
zip 함수를 사용하여 리스트에서 같은 인덱스의 원소만 대입되게 함.
for 반복문을 사용하여 내용이 출력되도록 하였음.
반복문을 작성할 때 어떤 부분을 효율적으로 처리해야 하는지 살펴보자.
5. 구구단 계산 프로그램 개선
while을 이용한 조건 제어 반복문으로 구구단 계산 프로그램을 만들었음.
1~9단까지 있는 구구단표를 출력하고 싶음.
한 번 반복한 것을 1단을 바꾸어 다시 반복함. (중첩 반복 구조)
지금까지 결과 분석
- 계산 결과들 사이에 간격이 없음.
- 단에 대한 표시가 없음.
→ 중간마다 출력해서 검토하기
몇 번째 단인지 표시해주는 것이 필요해서 곱셈 결과 나오기 전 줄에 추가함.
행의 숫자들이 오른쪽 정렬로 깔끔하게 맞춰져 나오면 좋겠음.
→ format함수로 형식 지정하기
개인적으로는 중첩 반복구조를 사용하는 것보다 출력 형식을 맞추는 것이 더 힘들었음.
코드가 길고 생소한 개념이 여러 개 나와서 이번 실습이 여태껏 가장 어렵게 느껴짐.