Python 기초: 변수에 값을 담고 조건으로 분기하는 첫 프로그램 짜기
파이썬에서 값을 변수에 저장하고, 자료형을 구분하고, 사용자 입력을 받아 조건에 따라 다른 결과를 출력하는 법을 배운다. 계산기, 성인 판별기, 최댓값 찾기 같은 짧은 프로그램을 직접 만들면서 문법을 손에 익힌다. 이 내용은 이후 모든 파이썬 코드(모델 학습 코드 포함)의 뼈대가 된다.
오늘의 목표
파이썬으로 "값을 저장했다가, 조건을 판단해서, 다른 동작을 하는" 프로그램을 짤 수 있게 되는 것이 오늘의 목표다. 아직 반복문도, 함수도 모르지만 이것만으로도 계산기나 판별기 수준의 프로그램은 충분히 만들 수 있다.
개념과 직관
변수(variable)는 값에 이름을 붙여서 나중에 다시 꺼내 쓸 수 있게 만드는 상자다. x = 5라고 쓰면 "x라는 이름표가 붙은 상자에 5를 넣는다"는 뜻이다. 여기서 =는 수학의 등호가 아니라 대입(assignment), 즉 "오른쪽 값을 왼쪽 이름에 넣어라"는 명령이다.
자료형(data type)은 상자 안에 든 값이 어떤 종류인지를 말한다.
int: 정수 (5,-3)float: 소수점 있는 실수 (3.14,0.5)str: 문자열, 큰따옴표나 작은따옴표로 감싼 텍스트 ("hello")bool: 참/거짓 딱 두 값만 가지는 타입 (True,False)
파이썬은 상자를 만들 때 타입을 미리 정해두지 않는다. x = 5라고 했다가 나중에 x = "다섯"이라고 다시 넣어도 에러가 안 난다. 이걸 동적 타이핑(dynamic typing)이라 부른다. 편하지만, 나중에 "5" + 3 같은 걸 실수로 하면 타입이 안 맞아서 에러가 난다.
입출력은 프로그램과 사람이 대화하는 창구다. input()은 키보드로 값을 받는데, 뭘 입력하든 항상 문자열(str)로 들어온다는 게 함정이다. 숫자로 쓰려면 int()나 float()로 변환해야 한다. print()는 화면에 값을 보여준다. f-string은 문자열 안에 변수 값을 바로 끼워넣는 문법이다: f"내 나이는 {age}살".
연산자는 값을 조작하는 기호다.
- 산술 연산자:
+,-,*,/(나눗셈, 항상 float),//(몫),%(나머지) - 비교 연산자:
>,<,==(같다),!=(다르다) — 결과는 항상 bool - 논리 연산자:
and,or,not— bool끼리 결합
조건문(if문)은 "이 조건이 참이면 A, 아니면 B"를 표현한다. 머릿속으로는 갈림길이라고 생각하면 된다. 코드가 위에서 아래로 흐르다가 if를 만나면, 조건을 확인하고 참인 길로만 들어간다.
수식으로 표현하면 이렇다 (텍스트로):
만약 조건1이 참이면: 블록1 실행
아니고 조건2가 참이면: 블록2 실행
둘 다 아니면: 블록3 실행파이썬은 이 블록을 중괄호가 아니라 들여쓰기(indentation)로 구분한다. 들여쓰기가 틀리면 바로 에러가 나거나 의도와 다른 곳에서 블록이 끝나버린다.
코드로 직접 해보기
1) 간단한 계산기
num1 = float(input("첫 번째 숫자: "))
op = input("연산자 (+, -, *, /): ")
num2 = float(input("두 번째 숫자: "))
if op == "+":
result = num1 + num2
elif op == "-":
result = num1 - num2
elif op == "*":
result = num1 * num2
elif op == "/":
if num2 == 0:
result = None
print("0으로는 나눌 수 없어요")
else:
result = num1 / num2
else:
result = None
print("모르는 연산자예요")
if result is not None:
print(f"결과: {result}")2) 나이 입력받아 성인 여부 판별
age = int(input("나이를 입력하세요: "))
if age >= 19:
print("성인입니다")
else:
print("미성년자입니다")여기서 age >= 19가 비교 연산자의 결과, 즉 bool 값(True/False)을 만들어내고 if문은 그 bool 값을 보고 분기한다는 걸 눈으로 확인해보자. print(age >= 19)를 따로 찍어보면 True나 False가 그대로 나온다.
3) 세 수 중 최댓값
a = float(input("첫 번째 수: "))
b = float(input("두 번째 수: "))
c = float(input("세 번째 수: "))
if a >= b and a >= c:
biggest = a
elif b >= a and b >= c:
biggest = b
else:
biggest = c
print(f"가장 큰 수는 {biggest}")and로 두 조건을 동시에 만족하는지 확인하는 부분이 논리 연산자가 실제로 쓰이는 지점이다.
오늘의 실험
이 Day는 실험 없음으로 표시되어 있다. 대신 위 세 코드에서 입력값을 바꿔가며 경계 케이스(boundary case)를 직접 눈으로 확인해보자.
- 성인 판별기: 나이를 정확히
19로 넣었을 때와18.9(에러가 날 것이다, int() 때문에)를 넣었을 때 각각 어떻게 되는지 관찰 - 최댓값 찾기: 세 수가 모두 같을 때(
5, 5, 5) 어떤 값이 출력되는지, 왜 그런지 코드 흐름을 따라가며 확인 - 계산기:
5 / 0을 넣었을 때 에러 없이 처리되는지 확인
관찰한 입력값과 출력값을 짧게 메모해두면 나중에 디버깅 감각을 키우는 데 도움이 된다.
왜 이걸 배우나 (LLM / Post-training 연결)
지금은 별거 아닌 것처럼 보이지만, 변수·조건문은 앞으로 모든 코드의 기본 문법이다. 예를 들어 모델 학습 코드에서 "검증 손실(validation loss)이 이전보다 낮으면 체크포인트 저장, 아니면 넘어가기" 같은 로직이 전부 오늘 배운 if문 그대로다. 또 데이터 전처리 스크립트에서 "이 샘플의 길이가 특정 값보다 길면 자르고, 짧으면 그대로 둔다" 같은 판단도 똑같은 패턴이다. Post-training 파이프라인에서 데이터 필터링, 하이퍼파라미터 분기 처리 같은 실무 코드는 결국 오늘 배운 변수·연산자·조건문의 조합일 뿐이다.
초보자가 막히는 지점
- input()은 항상 문자열이다:
age = input("나이: ")다음에age >= 19를 하면 문자열과 정수를 비교하려다 에러가 난다.int(input(...))처럼 바로 변환하는 습관을 들이자. - 들여쓰기 불일치: 탭과 스페이스를 섞어 쓰면 눈에는 똑같아 보여도 에러가 난다. 에디터에서 탭을 스페이스로 자동 변환하는 설정을 확인하자.
- `=`와 `==` 헷갈림:
if age = 19는 문법 에러다. 대입은=, 비교는==. - `/`와 `//` 혼동:
7 / 2는3.5,7 // 2는3. 정수 나눗셈이 필요한 상황에서/를 쓰면 의도와 다른 결과가 나온다. - elif 없이 if만 여러 개 쓰기:
if를 여러 번 쓰면 조건이 여러 개 참이어도 전부 실행될 수 있다. "하나만 선택"하려면 반드시elif/else로 묶어야 한다.
알고리즘 (병행 1시간)
LeetCode Easy 중 입출력과 조건문만으로 풀리는 문제 2개를 고른다 (예: 두 수 비교해서 큰 값 반환하는 유형, 특정 수의 부호나 짝홀 판별하는 유형처럼 반복문 없이 풀리는 문제 위주로 검색해서 선택할 것).
풀 때 아래 세 가지를 짧게 기록해두자:
- 접근: 어떤 조건으로 분기했는지, if/elif/else를 어떻게 나눴는지
- 시간복잡도: 오늘 수준에서는 대부분 O(1)일 텐데, 왜 그런지 한 줄로 설명해보기 (반복문이 없으니 입력 크기와 무관하게 일정한 연산 수)
- 틀린 이유: 만약 틀렸다면 조건식을 잘못 세운 건지, 타입 변환을 빼먹은 건지, 경계값(예: 0이나 음수) 처리를 안 한 건지 구분해서 적기