바이브코더를 위한 파이썬 기초 10편: 배운 것을 모아 할 일 목록 만들기
파이썬 변수·리스트·딕셔너리·함수·반복·조건을 모아 할 일 목록 프로그램을 만들고 한 줄씩 읽는다. AI 코드 검사 체크리스트 9가지와 다음 학습 단계를 정리했다.
1편부터 9편까지 변수, 조건문, 반복문, 리스트, 딕셔너리, 함수, 오류, 파일을 하나씩 살펴봤다. AI가 짜 주는 실제 프로그램은 새로운 문법보다 이 도구들의 조합으로 되어 있는 경우가 많다. 이 글은 '바이브코더를 위한 파이썬 기초' 10편 중 마지막 편으로, 앞에서 배운 것을 모아 작은 할 일 목록 프로그램을 만들고 한 줄씩 읽어 본다. 예제는 Python 3.15 기준으로 설명하며 Python 3.14.2에서 실행해 결과를 확인했다.
핵심 요약
- 프로그램은 새 문법이 아니라 조합이다. 먼저 데이터 모양을 정하고, 그 데이터를 다루는 함수를 만든다.
- 할 일 목록은 "딕셔너리를 담은 리스트"로 표현할 수 있다.
todos[0]["done"]은 "첫 번째 할 일의 완료 여부"다.- 함수 안에서 리스트에
append하면return이 없어도 밖의 리스트가 바뀐다.- 화면의 번호(1부터)와 리스트 인덱스(0부터)는 1 차이가 난다.
번호 - 1을 잊지 말자.
레고처럼 조립하되, 순서는 중요하다
이번 편은 레고 조립과 비슷하다. 이미 가진 조각을 끼워 맞춘다. 다만 레고와 다른 점이 있다. 레고 조각은 끼우는 순서와 상관없이 모양이 그대로지만, 코드는 순서가 바뀌면 결과가 달라진다(1편의 "위에서 아래로"). 함수를 만들기 전에 부르면 오류가 나고, 완료 표시를 하기 전에 출력하면 표시가 보이지 않는다.
할 일 목록 프로그램 전체 코드
todos = []
def add_todo(title):
todos.append({"title": title, "done": False})
def show_todos():
for i, todo in enumerate(todos, start=1):
mark = "✔" if todo["done"] else " "
print(f"{i}. [{mark}] {todo['title']}")
add_todo("파이썬 설치")
add_todo("변수 배우기")
todos[0]["done"] = True
show_todos()
1. [✔] 파이썬 설치
2. [ ] 변수 배우기
한 줄씩 읽어 보기: 어디서 배운 것인가
| 코드 | 하는 일 | 관련 편 |
|---|---|---|
todos = [] | 빈 리스트에 todos라는 이름을 붙인다 | 2·5편 |
{"title": title, "done": False} | 할 일 하나 = 제목과 완료 여부를 가진 딕셔너리 | 2·6편 |
def add_todo(title): | 할 일을 추가하는 함수 | 7편 |
todos.append(...) | 리스트 끝에 할 일 추가 | 5편 |
for i, todo in enumerate(...) | 번호와 할 일을 함께 꺼내 반복 | 4편 |
"✔" if todo["done"] else " " | 완료면 체크, 아니면 빈칸 | 3편 |
f"{i}. [{mark}] {todo['title']}" | 한 줄 문장 만들기 | 2편 |
todos[0]["done"] = True | 첫 번째 할 일을 완료로 바꾸기 | 5·6편 |
새로 나온 도구는 두 가지뿐이다.
enumerate(목록, start=1)은 항목과 함께 1부터 시작하는 번호를 돌려준다. 그래서i는 1, 2, …가 된다.A if 조건 else B는 조건이 참이면 A, 거짓이면 B를 고르는 한 줄짜리 조건문이다.
todos[0]["done"]은 왼쪽부터 한 단계씩 읽는다. 먼저 리스트에서 [0]으로 첫 번째 할 일(딕셔너리)을 고르고, 그 딕셔너리의 "done" 키를 본다. AI가 짠 코드에서 data["items"][0]["name"] 같은 긴 줄을 만나도 같은 방법으로 왼쪽부터 한 단계씩 풀면 된다.
흔한 함정: return이 없으니 add_todo는 아무것도 못 할까
7편에서 return이 없는 함수는 None을 돌려준다고 했다. 그런데 add_todo에는 return이 없는데도 목록이 늘어난다. 함수 안에서 리스트 자체를 바꾸기 때문이다. append는 새 리스트를 만들어 돌려주는 게 아니라, 있던 리스트에 항목을 더한다.
그래서 함수를 읽을 때는 두 가지를 구분한다.
- 값을 돌려받는 함수:
return으로 결과를 준다(예: 7편의add_tax). - 대상을 직접 바꾸는 함수: 리스트·딕셔너리를 그 자리에서 고친다(예:
add_todo).
AI 코드에서 "이 함수를 부르고 나니 다른 곳의 데이터가 바뀌었다"면 두 번째 경우인지 확인해 보자.
바이브코더를 위한 마무리: AI 코드를 검사하는 체크리스트
이 시리즈에서 다룬 내용을 AI 코드를 받았을 때 확인할 항목으로 모았다.
- 실행 위치: 터미널 명령과 파이썬 코드를 구분했나? 파일이 있는 폴더에서 실행했나?(1편)
- 값의 종류: 숫자로 계산할 값이 문자열은 아닌가?(2편)
- 조건 순서: 좁은 조건이 먼저 오는가? 경계값에서 결과가 맞는가?(3편)
- 반복의 끝:
range끝 값이 맞는가?while은 끝나는가?(4편) - 번호: 0부터 세는 인덱스와 1부터 세는 화면 번호를 섞지 않았나?(5편)
- 없는 키: 없을 수 있는 키를
[]로 읽고 있지 않나?(6편) - 돌려주는 값:
print만 하고return을 빠뜨리지 않았나?(7편) - 숨긴 오류:
except:로 모든 오류를 삼키고 있지 않나?(8편) - 파일: 덮어쓰기인지,
encoding="utf-8"이 있는지 확인했나?(9편)
직접 해 보기: mark_done 함수 추가
위 코드에 번호를 받아 완료 처리하는 mark_done(번호) 함수를 추가해 보자. 화면 번호는 1부터지만 리스트 인덱스는 0부터라 번호 - 1을 써야 한다.
todos = [
{"title": "파이썬 설치", "done": True},
{"title": "변수 배우기", "done": False},
]
def mark_done(number):
todos[number - 1]["done"] = True
def show_todos():
for i, todo in enumerate(todos, start=1):
mark = "✔" if todo["done"] else " "
print(f"{i}. [{mark}] {todo['title']}")
mark_done(2)
show_todos()
1. [✔] 파이썬 설치
2. [✔] 변수 배우기
mark_done(2) 뒤에 2번에도 ✔가 보이면 성공이다. 3처럼 없는 번호를 넣으면 5편의 IndexError가 난다. 이걸 8편의 try / except로 처리하거나, 9편처럼 목록을 파일에 저장하도록 넓혀 보는 것이 좋은 다음 연습이다.
다음에 배울 것
- 할 일 목록을 파일에 저장하고 다시 불러오기(9편 응용)
- 클래스와 모듈: 코드를 더 큰 단위로 묶는 법
- 표준 라이브러리: 6·9편에서 맛본
json·pathlib말고도 날짜·시간 같은 기본 도구가 많다 - 작은 자동화 스크립트: 파일 정리, 반복 작업 처리
이 정도 기초가 있으면 AI에게 "이 부분은 왜 이렇게 했어?"라고 물을 수 있고, 답을 듣고 맞는지 판단할 수 있다. 바이브코딩을 시작하는 출발점으로는 그 정도면 충분하다.