Python 문법·자료구조·함수
입력·조건·반복부터 list·dict와 함수 분리까지 콘솔 명단 프로그램으로 익히기
이번 문서에서 만드는 것
1주에는 입력을 받아 명단을 출력하고 2주에는 명단을 자료구조에 저장하여 검색하는 콘솔 프로그램을 만듭니다. Python을 처음 배우는 사람을 위한 문서입니다. 웹 서버나 데이터베이스는 아직 필요하지 않습니다.
완료하면 문자열과 숫자의 차이, 조건과 반복, list와 dict의 역할을 실제 코드로 설명할 수 있습니다. 아래 이름과 점수는 모두 가상 데이터입니다.
1주: 입력·조건·반복
빈 폴더에 main.py를 만들고 다음 코드를 넣습니다. 터미널에서 해당 폴더로 이동한 후 python main.py로 실행합니다. Windows에서 python이 없다면 설치된 Python 실행기인 py를 확인합니다.
name = input("이름: ").strip()if not name: print("이름을 입력해 주세요.")else: print(f"{name}님, 환영합니다.")
for week in range(1, 4): print(f"{week}주차 세션")input()의 결과는 항상 문자열입니다. strip()은 양끝 공백을 제거하며 빈 문자열은 조건식에서 거짓으로 취급됩니다. range(1, 4)는 1, 2, 3을 만듭니다. Python은 중괄호 대신 들여쓰기로 실행 범위를 정하므로 같은 블록은 공백 4칸으로 맞춥니다.
숫자를 받는 코드를 아래에 추가합니다. 변환 실패를 예상하고 처리하면 사용자 입력 때문에 프로그램이 종료되지 않습니다.
try: score = int(input("점수(0~100): ")) if 0 <= score <= 100: print("통과" if score >= 60 else "다시 연습") else: print("0~100 사이의 정수를 입력해 주세요.")except ValueError: print("숫자로 입력해 주세요.")세션 실습과 확인
권장 80분: 예측하고 실행하기 15분, 조건·반복 연습 25분, 입력 검증 25분, 짝 설명 15분입니다. 위 시간은 현장 세션에 대한 제안이며 VOD 재생 시간이 아닙니다.
- 이름에
가람, 공백만 있는 값, 한 글자를 각각 입력합니다. - 점수에
60,59,100,101,abc를 넣고 결과를 표로 기록합니다. - 반복 범위를 바꾸어 1–10주차를 출력합니다. 마지막 값이 포함되지 않는 이유를 설명합니다.
완료 기준: 잘못된 숫자 때문에 traceback이 발생하지 않고 조건의 경계값 두 개를 스스로 선택해 검사합니다.
2주: 자료구조와 함수로 명단 다루기
main.py를 다음 코드로 교체합니다. list는 여러 회원의 순서를, dict는 회원 한 명의 필드 이름과 값을 표현합니다. 회원 이름은 겹칠 수 있으므로 식별자로 사용하지 않습니다.
def add_member(members, name, track): name = name.strip() if not name: raise ValueError("이름은 비울 수 없습니다.") if track not in {"frontend", "design", "backend"}: raise ValueError("지원하지 않는 트랙입니다.") next_id = max((member["id"] for member in members), default=0) + 1 member = {"id": next_id, "name": name, "track": track} members.append(member) return member
def search_members(members, query): keyword = query.strip().casefold() return [member for member in members if keyword in member["name"].casefold()]
def main(): members = [] add_member(members, "가람", "frontend") add_member(members, "나래", "design") while True: query = input("검색어(종료는 /quit): ") if query == "/quit": break result = search_members(members, query) if not result: print("검색 결과가 없습니다.") for member in result: print(member["id"], member["name"], member["track"])
if __name__ == "__main__": main()return은 호출한 쪽에 값을 돌려주고 print는 화면에 보여 줍니다. 검색 함수는 화면 출력 없이 결과를 반환하므로 나중에 웹에서도 재사용할 수 있습니다. append는 전달받은 list 자체를 변경합니다. 복사본을 반환하는 검색과 구별해 보세요. 이 예제의 ID 생성은 단일 프로세스 메모리 실습용이며 실제 DB의 동시 요청용 번호 발급 방식이 아닙니다.
함수의 계약을 확인하기
같은 폴더의 test_members.py에 작성하고 python -m unittest -v를 실행합니다. 모든 검사가 ok여야 합니다.
import unittestfrom main import add_member, search_members
class MemberTests(unittest.TestCase): def test_add_and_search(self): members = [] member = add_member(members, " 가람 ", "frontend") self.assertEqual(member["name"], "가람") self.assertEqual(search_members(members, "가"), [member]) self.assertEqual(search_members(members, "없는 이름"), [])
def test_rejects_empty_name(self): with self.assertRaises(ValueError): add_member([], " ", "frontend")2주 권장 90분: 자료구조 비교 20분, 함수 분리 30분, 트랙 필터 추가 25분, 테스트·리뷰 15분입니다. search_members에 선택적인 트랙 필터를 추가하되 이름 검색이 계속 동작하게 만듭니다.
완료 기준: 이름 중복이 허용되는 이유와 ID의 역할을 설명하고 함수 하나에 정상·빈 결과·잘못된 입력 검사를 작성합니다. 프로그램을 종료하면 데이터가 사라지는 것은 이번 단계의 의도된 범위입니다.
막혔을 때
| 증상 | 먼저 확인할 것 |
|---|---|
IndentationError | 탭과 공백 혼용, if·for 다음 줄의 들여쓰기 |
KeyError | dict에 실제로 존재하는 키인지 확인. 무조건 get으로 숨기지 않기 |
입력끼리 더했는데 1020 출력 | 문자열 연결인지 확인하고 숫자 변환 위치 정하기 |
| import만 했는데 입력 대기 | 실행 코드를 if __name__ == "__main__" 아래에 두었는지 확인 |
더 읽어보기
연결된 PBL 미션과 VOD
| 주차·미션 | 참고 VOD 범위 |
|---|---|
| 1주 · Python 문법 | Python 첫걸음 3·5·6장 |
| 2주 · 자료구조와 함수 | Python 첫걸음 7·8장 |
강좌 안내: 참고 강좌 1. 이 문서는 영상 전체를 옮긴 전사 자료가 아닙니다. 세부 내용은 위 공식 문서에서 확인합니다.