파이썬 프로그래밍: 제어 구조, 다차원 리스트 및 파일 입출력 종합 학습 노트
제어 구조 및 조건문
제어 구조(Control Structure)의 개념
제어 구조란 컴퓨터가 작업을 처리하는 순서를 결정하는 구조를 의미합니다.
대표적인 3대 제어 구조로는 순차 구조, 선택 구조, 반복 구조가 존재하며, 이들을 중첩하여 복잡한 프로그램을 작성할 수 있습니다.
순차 구조: 위에서부터 아래 방향으로 코드를 순서대로 실행하는 구조입니다.
선택 구조: 주어진 조건의 참/거짓 여부에 따라 특정 코드 블록을 선택하여 실행하는 구조입니다 (
if ~ else문,if ~ elif ~ else문).반복 구조: 조건이 만족되는 동안 특정 코드 블록을 반복적으로 실행하는 구조입니다 (
for문,while문).
파이썬 조건문 (
if문)의 기본 개념 및 규칙조건문은 특정 조건의 성립 여부에 따라 서로 다른 명령을 실행하고자 할 때 사용합니다.
조건식의 평가 결과는 오직 참(
True) 또는 거짓(False) 두 가지 조건값만 가집니다.문법적 규칙으로
if,else,elif문장 끝에는 반드시 콜론(:)을 붙여야 합니다.파이썬은 블록 구분을 들여쓰기(Indentation)로 수행하므로 들여쓰기가 매우 중요합니다.
if문 다음 줄의 실행할 문장은 반드시 들여쓰기를 적용해야 합니다.들여쓰기는
Tab키를 1번 누르거나Spacebar를 4칸 입력하는 것을 권장합니다.동일한 블록 내의 명령문들은 반드시 동일한 들여쓰기 깊이를 유지해야 합니다.
대화형 모드(Interactive Mode)에서는 실행할 문장 작성을 마친 후
Enter키를 2번 눌러야 조건문 작성이 완료된 것으로 간주합니다.
조건문의 유형별 구조 및 특징
단일
if구조조건식이 참이면 지정된 문장을 실행하고, 거짓이면 아무것도 실행하지 않고 다음 문장으로 넘어갑니다.
구문 구조:
python if 조건식: 문장 1 if ~ else구조조건식이 참일 때 실행할 문장과 거짓일 때 실행할 문장을 서로 다르게 설정합니다.
조건식이 참이면 문장 1을 실행하고, 거짓이면 문장 2를 실행합니다.
구문 구조:
python if 조건식: 문장 1 else: 문장 2 if ~ elif ~ else구조검사해야 할 조건이 2개 이상일 때 활용하는 다중 선택 구조입니다.
조건식 1이 참이면 문장 1을 실행하고, 그렇지 않고 조건식 2가 참이면 문장 2를 실행하며, 모든 조건식이 거짓이면
else블록의 문장 3을 실행합니다.조건의 개수에 따라
elif블록을 제한 없이 여러 개 추가할 수 있습니다.구문 구조:
python if 조건식 1: 문장 1 elif 조건식 2: 문장 2 else: 문장 3

조건문 예제 코드 분석
조건식이 거짓인 단일
if문 예제
a = 200 if a < 100: print("100보다 작군요") print("거짓이므로 이 문장은 안보이겠죠?") print("프로그램 끝") ``` - 변수 의 값이 이므로 조건식 은 거짓(`False`)이 됩니다. 이에 따라 들여쓰기된 4행과 5행의 `print()` 문은 실행되지 않고, 7행의 `print("프로그램 끝")`만 실행되어 출력됩니다. - 양방향 분기 `if ~ else` 문 예제python a = 200 if a < 100: print("100보다 작군요") else: print("100보다 크군요") ```
조건식 이 거짓이므로
else:이하에 해당하는 6행이 실행되어 "100보다 크군요"가 출력됩니다.짝수 및 홀수 판별 프로그램 예제
정수를 로 나눈 나머지 연산자(
%)의 결과가 이면 짝수, 이면 홀수로 판별합니다.python a = int(input("정수를 입력하세요:")) if a % 2 == 0: print("짝수를 입력하셨군요.:") else: print("홀수를 입력하셨군요.:")
중첩
if문 (NestedifStatement)조건 검사 과정을 2번 이상 연속으로 진행해야 할 때
if문 내부에 또 다른if문을 중첩하여 작성합니다.조건검사 예제: 수학 점수가 이상인 남학생 수 구하기
students = [ {"name": "철수", "gender": "남", "math_score": 85}, {"name": "영희", "gender": "여", "math_score": 92}, {"name": "민수", "gender": "남", "math_score": 78} ] # 학생의 정보를 딕셔너리{}에 넣고 리스트[]로 관리함 count = 0 # 카운트 변수 초기화 for s in students: # 반복문을 통해 조건 확인 if s["gender"] == "남": if s["math_score"] >= 80: count += 1 print(f"수학 점수가 80점 이상인 남학생은 총 {count}명입니다.") ``` - 성별이 "남"인 조건을 먼저 검사하고, 이를 만족할 때 수학 점수가 이상인지 2차로 검사하여 조건에 맞는 학생만 `count`를 씩 증가시킵니다. 실행 결과 철수 1명이 조건에 적합하여 총 으로 집계됩니다. - 학점 산출 예제 (`if ~ else` 중첩 방식과 `if ~ elif ~ else` 비교) - 중첩 `if ~ else` 문 구현 방식:python score = int(input("점수를 입력하세요:")) if score >= 90: print("A") else: if score >= 80: print("B") else: if score >= 70: print("C") else: if score >= 60: print("D") else: print("F") print("학점입니다.") ```
if ~ elif ~ else축약 구현 방식 (동일 로직, 가독성 향상):python score = int(input("점수를 입력하세요:")) if score >= 90: print("A") elif score >= 80: print("B") elif score >= 70: print("C") elif score >= 60: print("D") else: print("F") print("학점입니다.")

반복문
반복문(Loop Statement)의 개념
동일하거나 유사한 명령 문장을 반복해서 수행하도록 프로그램을 제어하는 구문입니다.
파이썬에서는 대표적으로
for문과while문을 제공합니다.반복문을 활용하면 동일한 문장을 , , 이상 출력할 때 소스 코드를 중복해서 작성할 필요 없이 효율적으로 처리할 수 있습니다.
range()함수 상세 분석숫자 리스트를 지정된 규칙에 따라 자동으로 생성해 주는 함수로,
for문과 조합하여 반복 횟수를 지정할 때 핵심적으로 사용됩니다.기본 형식:
range(시작값, 끝값+1, 증감값)매개변수에 따른 전달값 예시 정리:
range(5)또는range(0, 5): 시작값 , 끝값 미만, 증감값 이 적용되어 수열 생성 (총 5개 요소).range(0, 5, 2): 시작값 , 끝값 미만, 증감값 가 적용되어 수열 생성.range(5, 0, -2): 시작값 , 끝값 초과, 증감값 가 적용되어 감수 수열 생성.
for문 상세 및 실습 예제지정된 횟수나 시퀀스 객체(리스트, 튜플, 문자열, 딕셔너리 등)의 모든 요소를 순회하면서 반복을 실행합니다.
기본 구문:
for 변수 in range(시작값, 끝값+1, 증감값): 반복 실행할 명령문 ``` - `for i in range(0, 3, 1):` 실행 단계 및 제어 변수 변환 과정: - 제 1회: 변수 `i`에 을 대입한 후 내부 `print()` 함수 수행. - 제 2회: 변수 `i`에 을 대입한 후 내부 `print()` 함수 수행. - 제 3회: 변수 `i`에 를 대입한 후 내부 `print()` 함수 수행. - `print()` 함수 출력 옵션 제어: `print("%d" % i, end=" ")`와 같이 `end=" "` 속성을 지정하면 출력 완료 후 줄바꿈 대신 공백을 삽입하여 결과를 한 줄로 연속 출력할 수 있습니다. - 주요 실습 문제 풀이: - 문제 1: `for` 문 내부의 변수 `i`를 활용하여 부터 까지의 숫자를 한 칸씩 띄워서 출력하기python for i in range(1, 6, 1): print("%d" % i, end=" ") # 실행 결과: 1 2 3 4 5 ```
문제 2:
for문을 사용하여 부터 까지의 정수 합계 구하기
hap, i = 0, 0 for i in range(1, 11, 1): hap = hap + i print("1에서부터 10까지의 합계: %d" % hap) # 실행 결과: 1에서부터 10까지의 합계: 55 ``` - 문제 3: 과 사이에 존재하는 홀수들의 합계 구하기python hap, i = 0, 0 for i in range(500, 1001, 1): if i % 2 != 0: hap = hap + i print("500에서부터 1000까지의 홀수의 합계: %d" % hap) # 또는 range의 증감값을 2로 설정하여 구현: # for i in range(501, 1001, 2): hap += i ```
중첩
for문 (NestedforLoop)for문 구문 내부에 또 다른for문이 위치하는 중첩 구조입니다.중첩
for문의 총 실행 횟수 공식:동작 예제 코드:
python for i in range(0, 3, 1): for k in range(0, 2, 1): print("프로그래밍 재미있다~ (i값: %d, k값: %d)" % (i, k)) 바깥
for문이 3회(), 안쪽for문이 2회() 반복되므로 총 실행됩니다.구구단 전체(단~단) 출력 프로그램 예제:
python i, k = 0, 0 for i in range(2, 10, 1): # 바깥 for 문: 단 수 (2단 ~ 9단) print("## %d단 ##" % i) for k in range(1, 10, 1): # 안쪽 for 문: 곱하는 수 (1 ~ 9) print("%d X %d = %2d" % (i, k, i * k)) print("") # 단과 단 사이에 빈 줄 출력

while문 상세 분석주어진 조건식이 참(
True)을 만족하는 동안 블록 내의 명령들을 반복 실행하는 구문입니다.문장 끝에는 반드시 콜론(
:)을 작성해야 합니다.구조 형식:
python 초깃값 설정 while 조건식: 반복 실행할 명령문 조건 변경식 (증감식) 실행 순서 흐름 예제:
python sum = 0 while sum <= 60: sum = sum + 5 sum의 초깃값 에서 시작하여 조건sum <= 60이 참인 동안sum에 를 계속 더하여,sum이 가 되는 순간 조건식이 거짓이 되어 반복을 종료합니다.무한 반복(Infinite Loop)과 루프 탈출 조건
조건식이 항상 참으로 평가되거나, 루프 내부에서 조건 변수의 값이 업데이트되지 않는 경우 프로그램이 무한 루프 상태에 빠집니다.
무한 루프 표기 예:
while True:또는while 1:무한 루프 중지 및 탈출 방법:
인터프리터 콘솔이나 IDLE 환경에서는 키보드의
Ctrl + C키를 눌러 강제로 루프를 정지시킵니다.소스 코드 내부에서는 조건문에
break문을 결합하여 특정 조건 달성 시 반복문을 즉시 빠져나오도록 구현합니다.

turtle그래픽 모듈을 활용한 반복문 실습 (디지털 아트 구현) ```python import turtle as tinatina.shape('turtle') tina.bgcolor('black') # 배경색 검은색 설정 tina.color('yellow') # 펜 색상 노란색 설정 tina.speed = 0 # 이동 속도를 가장 빠르게(0) 설정
for i in range(200): tina.forward(i) # i만큼 앞으로 이동 tina.left(89) # 왼쪽으로 89도 회전
tina.hideturtle() ```

다차원 데이터 구조 - 리스트
리스트(List)의 개념 및 정의
리스트는 다양한 자료(데이터)들을 순서대로 저장하는 파이썬의 대표적인 선형 자료구조입니다.
단일 값을 저장하는 변수와 유사하지만, 하나의 리스트 변수에 여러 개의 값을 동시에 모아서 저장 및 관리할 수 있다는 차이점이 있습니다.
리스트를 활용하면 많은 양의 데이터들을 한 번에 집적하여 효율적으로 처리하고 가공할 수 있습니다.
리스트 선언 및 요소 접근 방법
대괄호
[]를 사용하여 선언하며, 생성된 리스트는 컴퓨터 메모리 내부 공간에 연속적으로 저장됩니다.파이썬 리스트는 정수, 실수, 문자열, 불리언(
True/False) 등 다양한 자료형을 하나의 리스트 안에 혼합하여 저장할 수 있습니다.리스트 요소(Element): 리스트 내부를 구성하는 각각의 개별 값입니다.
인덱스(Index): 리스트 요소의 위치 번호로, 첫 번째 요소는 번 인덱스부터 시작하는 0-기반 인덱싱(Zero-based indexing)을 사용합니다.
선언 및 확인 코드 예제: ```python conversion
리스트 선언
book = ['홍길동전', '김한국', 2022, '813.5-아22r-8', True]
인덱스를 통한 도서 정보 확인
print('도서명', book[0]) # 홍길동전 print('저자', book[1]) # 김한국 print('발행연도', book[2]) # 2022 print('청구기호', book[3]) # 813.5-아22r-8 print('대출가능상태', book[4]) # True ```
함수를 활용한 리스트 연속 생성
range()함수와list()변환 함수를 조합하면 일련의 정수 요소를 갖는 리스트를 간결하게 선언할 수 있습니다.생성 방식 비교:
직접 입력 방식:
list1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]range()함수 활용 방식:python num = range(0, 10, 1) list2 = list(num) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] list3 = list(range(0, 10, 1)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] list4 = list(range(0, 10)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (증감값 1 생략) list5 = list(range(10)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (시작값 0, 증감값 1 생략)
리스트 인덱스 응용 예제
인덱싱을 통해 문자열 결합하여 'ACE' 출력하기:
alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G'] print(alphabet[0] + alphabet[2] + alphabet[4]) # 실행 결과: ACE ``` - 부터 사이의 짝수 리스트 생성하기:python even = list(range(2, 11, 2)) print(even)
실행 결과: [2, 4, 6, 8, 10]
```
리스트 전용 주요 내장 함수 및 메서드 명세
append(값): 리스트의 가장 마지막 위치에 새로운 값을 추가합니다.insert(인덱스, 값): 지정한 인덱스 위치에 새로운 값을 삽입합니다.pop(인덱스): 지정한 인덱스 위치의 값을 꺼내어 반환하고, 리스트 내에서 해당 요소를 삭제합니다. 인덱스를 입력하지 않을 경우 가장 마지막 요소를 꺼내어 삭제합니다.remove(값): 리스트에서 지정된 값을 찾아 삭제합니다. 동일한 값을 가진 요소가 여러 개 존재할 경우 가장 앞에 위치한 첫 번째 요소만 삭제합니다.index(값): 리스트에 존재하는 특정 값의 인덱스 위치 번호를 알려줍니다.count(값): 리스트에 존재하는 특정 값의 개수를 반환합니다.len(리스트명): 리스트에 저장된 전체 요소의 개수(길이)를 반환합니다.메서드 종합 실습 코드:
python text = ['파이썬', '정말', '재미있어'] text.append('!') # ['파이썬', '정말', '재미있어', '!'] print(text) text.pop() # '!' 꺼내서 삭제 -> ['파이썬', '정말', '재미있어'] print(text) text.remove('정말') # '정말' 삭제 -> ['파이썬', '재미있어'] print(text) text.insert(1, '쉽고') # 인덱스 1 위치에 '쉽고' 삽입 -> ['파이썬', '쉽고', '재미있어'] print(text) print(len(text)) # 요소의 개수 출력 -> 3
리스트 슬라이싱(Slicing) 연산
리스트 내에서 특정 인덱스 범위를 지정하여 부분적인 요소 집합을 가져오는 연산 방식입니다.
기본 형식:
리스트명[시작 인덱스 : 끝 인덱스 + 1 : 증감값]범위 설정 규칙: 시작 인덱스부터
(끝 인덱스 + 1) - 1위치에 있는 요소까지 가져옵니다.슬라이싱 실습 및 문자열 확장 적용: ```python
리스트 슬라이싱
list6 = [1, 2, 3, 4, 5] print(list6[0:2+1:1]) # 인덱스 0부터 2까지 값 추출 -> [1, 2, 3]
list7 = list(range(1, 11)) print(list7[1:10:2]) # 인덱스 1부터 9까지 2씩 증가 -> 짝수 값 [2, 4, 6, 8, 10] 추출
문자열 슬라이싱 (리스트와 동일하게 적용 가능)
text = '산토끼 토끼야' print(text[0:3:1]) # 인덱스 0부터 2까지 추출 -> '산토끼' ```

다차원 리스트 (Multidimensional List)
다차원 리스트 개념: 리스트의 요소로서 또 다른 리스트를 포함하고 있는 중첩 리스트 구조입니다.
2차원 리스트
행(Row)과 열(Column)에 해당하는 2개의 인덱스(
[행][열])를 보유합니다.1차원 리스트 복수 개를 아래로 쌓아 올려 평면 격자 구조를 형성합니다.
3차원 리스트
면(Page), 행(Row), 열(Column)에 해당하는 3개의 인덱스(
[면][행][열])를 보유합니다.2차원 리스트 여러 개를 두께 방향으로 쌓아 올려 입체 구조를 형성합니다.

2차원 리스트 선언 및 데이터 가공 예제: ```python
음식점 메뉴와 가격을 저장한 2차원 리스트 선언
food = [['라면', 5000], ['비빔밥', 8000], ['김밥', 5000]]
인덱싱을 이용한 비빔밥 가격 출력 (1행 0열: 메뉴명, 1행 1열: 가격)
print(f'{food[1][0]}의 가격은 {food[1][1]}원입니다.')
새로운 데이터 추가
add = ['오므라이스', 8500] food.append(add) print(food)
실행 결과: [['라면', 5000], ['비빔밥', 8000], ['김밥', 5000], ['오므라이스', 8500]]
```
파이썬 파일 입출력
파일 입출력(File I/O)의 필요성 및 주요 목적
데이터 공유: 프로그램 내의 데이터를 외부 파일로 저장함으로써 다른 프로그램이나 사용자와 데이터를 상호 공유할 수 있습니다.
데이터 갱신: 자주 바뀌는 데이터를 프로그램 코드 내부에 직접 하드코딩하지 않고 외부 파일로 관리하면, 소스 코드 수정 없이 파일 내용 수정만으로 프로그램의 동작 데이터를 반영할 수 있습니다.
데이터 보존: 프로그램 실행 중에 생성된 휘발성 데이터를 저장 장치(SSD/HDD)에 파일로 보존하여, 프로그램이 종료된 이후에도 지속적으로 보존할 수 있습니다.
대용량 데이터 처리: 주기억장치(RAM)의 용량을 초과하는 대용량 데이터의 경우, 파일을 분할 저장하거나 필요한 부분만 순차적으로 불러와 처리할 수 있습니다.
파일 열기 (
open()함수)문법 구문:
파일 객체 = open('파일경로', '파일 접근방식', encoding='UTF-8')파일 객체(File Object)의 이름 지정 방식은 일반 파이썬 변수명의 작성 규칙과 동일합니다.
파일 경로 확인법: 윈도우 파일 탐색기에서 파일 우클릭 후 [속성] 메뉴에서 전체 파일 경로를 확인할 수 있습니다.
실행 중인 파이썬 스크립트 파일(
*.py)과 열고자 하는 대상 파일이 동일한 폴더에 위치한 경우 경로를 생략하고 파일명만 작성하여 열 수 있습니다.파일 접근 방식(Mode) 모드 명세:
읽기 모드 (
'r'): 기존 파일의 데이터 내용을 유지하면서 데이터를 읽어옵니다. 파일 열기 시 접근 방식을 명시하지 않으면 기본값(Default)으로 지정됩니다.쓰기 모드 (
'w'): 파일 내부의 기존 데이터를 모두 삭제한 후 새로운 데이터를 기록합니다. 지정한 파일이 존재하지 않을 경우 새 파일을 생성합니다.추가 모드 (
'a'): 파일의 기존 데이터를 보존하면서 파일의 가장 끝부분에 새로운 데이터를 추가합니다. 지정한 파일이 존재하지 않을 경우 새 파일을 생성합니다.
파일 읽기 전용 함수
파일 객체를 매개로 읽기 함수를 호출하며, 파일로부터 읽어들인 모든 데이터는 문자열(
str) 자료형으로 처리됩니다.파일객체.read(): 지정된 파일의 전체 내용을 한 번에 읽어 하나의 통문자열로 반환합니다.파일객체.readline(): 지정된 파일의 내용을 한 번에 한 줄씩 읽어서 문자열로 반환합니다.파일객체.readlines(): 지정된 파일의 모든 줄을 읽어 들여 각 줄을 요소로 갖는 리스트(list) 형태로 변환합니다.
파일 쓰기 및 닫기 전용 함수
파일객체.write(내용): 파일에 단일 문자열 데이터를 기록합니다. 만약 기록할 내용에 문자열이 아닌 숫자형 등의 데이터가 포함된 경우str()로 변환해야 구문 오류(SyntaxError)가 발생하지 않습니다.파일객체.writelines(리스트): 리스트 내부에 저장된 여러 문자열 요소들을 연결하여 파일에 일괄 기록합니다.파일객체.close(): 사용이 완료된 파일 객체를 닫습니다. 파일 사용 후 반드시close()를 호출해야 다른 프로그램이나 운영체제에서 해당 파일에 접근하여 다룰 수 있습니다.
종합 실습 예제
카페 메뉴 파일 읽기 및 주문 영수증 파일 출력 프로그램
# 1. cafemenu.csv 파일 읽고 전체 출력하기 menufile = open('cafemenu.csv', 'r', encoding='UTF-8') print('메뉴목록입니다. ', menufile.read()) menufile.close() # 2. 음료 주문받고 receipt.txt 파일에 주문내역 생성하기 order = input('주문하신 음료를 입력해주세요.') quantity = input('몇 잔 주문하시겠습니까?') print(order, quantity, '잔 주문 받았습니다.') file = open('receipt.txt', 'w', encoding='UTF-8') file.write('주문내역 음료: ' + order + ' 수량: ' + quantity) file.close() ``` - CSV 메뉴판 데이터 파싱 및 결제 금액 자동 계산 프로그램python
cafemenu.csv 파일 읽기
menufile = open('cafemenu.csv', 'r', encoding='UTF-8')
메뉴와 가격을 저장할 딕셔너리 객체 생성
menu_price = {}
첫 줄(헤더 정보: 메뉴, 가격) 건너뛰기
menufile.readline()
파일 한 줄씩 읽어 딕셔너리에 저장
for line in menufile: menu, price = line.strip().split(',') menu_price[menu] = int(price) menufile.close()
메뉴 및 가격 목록 화면 출력
print('메뉴목록입니다.') for menu in menu_price: print(menu, ':', menu_price[menu], '원')
사용자 주문 받기 및 금액 계산
order = input('주문하신 음료를 입력해주세요.') quantity = int(input('몇 잔 주문하시겠습니까?')) total = menu_price[order] * quantity
결과 출력
print(order, quantity, '잔 주문 받았습니다.') print('총 금액은', total, '원입니다.')
영수증 파일(receipt.txt) 쓰기
file = open('receipt.txt', 'w', encoding='UTF-8') file.write('주문내역 ') file.write('음료 : ' + order + ' ') file.write('수량 : ' + str(quantity) + ' ') file.write('총 금액 : ' + str(total) + '원') file.close() ```
카페 이벤트 참가자 정보 저장 및 명단 조회 프로그램
카페 이용 손님의 이름, 전화번호, 메일주소를 입력받아
event.txt파일에 누적 추가('a')하고, 등록된 전체 명단을 읽어와서 화면에 출력하는 프로그램입니다. ```python
사용자 입력 받기
name = input('성명을 입력해주세요:') number = input('전화번호를 입력해주세요:') mail = input('메일주소를 입력해주세요:') print('참여해주셔서 감사드립니다.')
추가 모드('a')로 event.txt 파일에 기록
file = open('event.txt', 'a', encoding='UTF-8') file.write('성명:' + name + ' 전화번호:' + number + ' 메일주소:' + mail + ' ') file.close()
읽기 모드('r')로 전체 참여 명단 출력
event = open('event.txt', 'r', encoding='UTF-8') print('<현재까지 참여 명단>') print(event.read()) event.close() ```