파이썬 기초 문법 1
입출력, 기본 자료형, 그리고 데이터 장바구니 만들기
변수와 입출력 기초
데이터에 이름을 붙이고, 컴퓨터와 대화하기
CPU · RAM · 디스크와 변수의 관계
파이썬 코드는 세 장치가 역할을 나누어 처리하며, 변수는 RAM 속 데이터에 붙이는 이름표입니다.
연산 처리
덧셈·비교·함수 실행 등 프로그램의 명령을 실제로 처리합니다.
실행 중 데이터
CPU가 바로 읽고 쓸 데이터를 잠시 보관합니다. 전원이 꺼지면 내용이 사라집니다.
영구 저장
파일을 오래 보관하지만 RAM보다 느리므로 데이터를 RAM으로 불러와 처리합니다.
디스크의 파일 → RAM에 로드 → 변수로 데이터 참조 → CPU가 연산
화면에 띄우고, 사용자에게 받기
가장 기본이 되는
입력과 출력 함수입니다.
데이터를 확인하려면 화면에 출력해야 하고, 프로그램이 시작되려면 질문을 던져 값을 받아야 합니다.
- print(): 소괄호 안의 데이터를 화면에 출력합니다.
- input(): 사용자가 값을 입력할 수 있도록 창(또는 커서)을 띄웁니다. 항상 문자열 형태로 입력받습니다.
입출력 기본 예시
print("데이터 분석을 시작합니다.")
> 데이터 분석을 시작합니다.
# 사용자에게 입력받기
name = input("이름이 무엇인가요? ")
print(name)
변수(Variable): 데이터를 담는 상자
데이터에 이름표를 붙여서
필요할 때마다 꺼내 씁니다.
- 파이썬에서 = 기호는 '같다'가 아니라, '오른쪽의 값을 왼쪽 상자에 넣어라(대입)'는 의미입니다.
- 들어오는 데이터의 형태(숫자, 글자 등)에 따라 상자의 성격이 알아서 결정됩니다. (동적 타입)
변수 할당 예시
major = "소프트웨어"
print(age)
> 22
# 콤마(,)를 사용해 여러 개 출력 가능
print(age, major)
> 22 소프트웨어
기본 자료형: 데이터의 종류
소수점이 없는 깔끔한 숫자입니다. (예: 10, -5)
소수점이 있는 숫자입니다. 정밀한 계산에 씁니다. (예: 3.14)
따옴표(', ")로 감싸진 텍스트입니다. (예: "Hello")
타입이 다르면 섞을 수 없습니다
숫자는 숫자끼리 계산해야 합니다. 숫자와 글자를 그냥 더하면 에러가 납니다.
b = "20" # 글자
print(a + b)
# TypeError 발생!
Google Colab에서 코드 설명 확인하기
변수나 함수 뒤에 ?를 붙이면
Colab 도움말을 확인할 수 있습니다.
- # 뒤의 내용은 실행되지 않는 한 줄 주석입니다.
- 변수?는 타입, 값의 표현, 길이와 설명을 보여줍니다.
- 함수?는 함수의 사용법과 매개변수 설명을 보여줍니다.
- 큰따옴표 또는 작은따옴표 3개로 여러 줄 문자열을 작성할 수 있습니다.
myBook = (2019, "Python for Data Analysis",
"웨스 맥키니", 664)
myBook?
Type: tuple
Length: 4
Docstring: Built-in immutable sequence.
len?
# len 함수의 사용법이 도움말로 표시됨
형변환(Type Casting): 데이터 모양 바꾸기
앞서 발생한 에러를 막으려면, 데이터의 형태를 강제로 맞춰주어야 합니다.
- int(): 글자나 실수를 정수로 바꿉니다.
- str(): 숫자를 글자로 바꿉니다.
- float(): 글자나 정수를 실수로 바꿉니다.
형변환 예시
b = "20"
# b를 정수로 바꿔서 더하기
print(a + int(b))
> 30
# input()으로 받은 값은 항상 글자이므로
# 숫자로 쓰려면 변환이 필수!
age = int(input("나이: "))
연산자와 문자열 조작
계산하고, 자르고, 데이터를 내 입맛에 맞게 바꾸기
사칙연산과 특수 연산자
일반적인 더하기(+), 빼기(-), 곱하기(*) 외에 파이썬에서 자주 쓰이는 유용한 연산자들이 있습니다.
- / (나누기): 소수점까지 정확히 나눕니다.
- // (몫): 나누었을 때 몫만 남깁니다.
- % (나머지): 나눈 후 남은 나머지 값을 구합니다. (홀/짝 구분에 유용!)
- ** (거듭제곱): 숫자를 거듭해서 곱합니다.
> 3.3333333333333335
print(10 // 3) # 몫
> 3
print(10 % 3) # 나머지
> 1
print(2 ** 3) # 2의 3제곱
> 8
글자도 더하고 곱할 수 있습니다
글자끼리 더하면 연결되고,
숫자를 곱하면 반복됩니다.
파이썬은 문자열에 사칙연산 기호를 직관적으로 적용할 수 있어 매우 편리합니다.
word1 = "Python"
word2 = " 최고!"
print(word1 + word2)
> Python 최고!
# 문자열 곱하기 (반복)
line = "-" * 20
print(line)
> --------------------
문자열 조작하기 (가르기, 바꾸기, 자르기)
.split()
띄어쓰기나 특정 기호를 기준으로 텍스트를 쪼갭니다.
.replace()
특정 단어를 다른 단어로 교체합니다.
슬라이싱 [시작:끝]
시작 위치부터 끝 위치 직전까지만 텍스트를 잘라옵니다. (위치 번호는 0부터 시작)
# '-'를 기준으로 쪼개기
print(text.split('-'))
> ['2026', '09', '13']
# '-'를 '.'으로 바꾸기
print(text.replace('-', '.'))
> 2026.09.13
# 연도만 슬라이싱으로 빼내기 (0~3번째)
print(text[0:4])
> 2026
문자열 포맷팅과 숫자 반올림
출력 형식을 정돈하고,
소수점을 반올림합니다.
- format(): 문자열의 템플릿에 값을 채워넣습니다. { } 를 자리표시자로 사용합니다.
- round(숫자, 자리수): 숫자를 소수점 특정 자리에서 반올림합니다.
name = "홍길동"
age = 30
print("이름: {}, 나이: {}세".format(name, age))
> 이름: 홍길동, 나이: 30 세
# round() 로 소수점 반올림
pi = 3.14159265
print(round(pi, 2))
> 3.14
# format 으로 소수점 자리 지정
price = 10000
print("가격: {:,}원".format(price))
> 가격: 10,000 원
시퀀스(Sequence) 자료형
여러 데이터를 한 번에 모아서 관리하는 리스트와 튜플
리스트: 자유로운 장바구니
언제든 물건을 넣고, 빼고, 바꿀 수 있는 장바구니입니다.
- 대괄호 [ ] 를 사용하여 만듭니다.
- 가장 널리 쓰이며, 여러 형태의 데이터를 한 번에 담을 수 있습니다.
- 내용물을 수정할 수 있다(가변성)는 점이 핵심입니다.
cart = []
# 값이 들어있는 리스트
students = ["가석현", "김철수", "이영희"]
# 위치(색인)로 접근하여 값 변경
students[1] = "박철수"
print(students)
> ['가석현', '박철수', '이영희']
리스트: 항목 추가·삭제·정렬하기
리스트 전용 도구(메서드)를 사용하면 항목을 손쉽게 조작할 수 있습니다.
- append(값): 리스트 맨 끝에 값을 추가합니다.
- remove(값): 리스트에서 특정 값을 찾아 지웁니다.
- sort(): 리스트 항목을 오름차순으로 정렬합니다. (reverse=True는 내림차순)
- reverse(): 리스트 순서를 거꾸로 뒤집습니다.
- len(리스트): 장바구니에 담긴 항목의 개수를 셉니다.
# 항목 추가
cart.append("포도")
print(cart)
> ['사과', '바나나', '포도']
# 항목 삭제
cart.remove("사과")
print(cart)
> ['바나나', '포도']
# 순서 정렬 (내림차순)
cart.sort(reverse=True)
print(cart)
> ['포도', '바나나']
# 순서 뒤집기
cart.reverse()
print(cart)
> ['바나나', '포도']
# 데이터 개수 확인
print(len(cart)) > 2
튜플: myBook 만들기
책 한 권의 정보를
정해진 순서로 묶어 봅시다.
- 소괄호 ( ) 를 사용하거나, 괄호 없이 쉼표로 나열하여 만듭니다.
- 각 항목은 출판연도, 제목, 저자, 페이지 수의 순서입니다.
- 한번 저장한 항목은 바꿀 수 없는 불변(immutable) 자료형입니다.
myBook = 2019, "Python for Data Analysis",
"웨스 맥키니", 664
print(type(myBook))
> <class 'tuple'>
print(myBook)
> (2019, 'Python for Data Analysis',
'웨스 맥키니', 664)
# 항목 변경은 불가능
myBook[3] = 700
# TypeError: 'tuple' object does not support item assignment
튜플: myBook의 인덱스로 항목 조회하기
인덱스는 앞에서 0부터,
뒤에서는 -1부터 셉니다.
- myBook[0]: 첫 번째 항목인 출판연도
- myBook[-1]: 마지막 항목인 페이지 수
- len(myBook): 전체 항목 개수
- 유효 범위를 벗어나면 IndexError가 발생합니다.
> 2019
print(myBook[2])
> 웨스 맥키니
print(myBook[-1])
> 664
print(myBook[len(myBook) - 1])
> 664
myBook[4]
# IndexError: tuple index out of range
튜플: 패킹과 언패킹
여러 값을 하나의 튜플로 묶는 것을 패킹, 튜플의 값을 여러 변수로 나누어 담는 것을 언패킹이라고 합니다.
주의: 언패킹할 변수 개수와 튜플의 항목 개수가 같아야 합니다.
myBook = 2019, "Python for Data Analysis",
"웨스 맥키니", 664
# 언패킹: 튜플 → 여러 변수
year, title, author, pages = myBook
print(year, author)
> 2019 웨스 맥키니
print(title, pages)
> Python for Data Analysis 664
튜플: 항목 변경과 변수 재대입
# 기존 튜플 객체의 항목을 바꾸려 하므로
# TypeError 발생
"조인석", 435)
# 새 튜플 객체를 만들고
# myBook 이름표를 새 객체에 붙임
튜플이 불변이라는 말은 객체 내부의 항목을 바꿀 수 없다는 뜻입니다. 변수는 다른 객체를 다시 가리킬 수 있습니다.
리스트·튜플: 슬라이싱의 세 요소
[시작:끝:간격]을 함께 써서
필요한 항목만 선택합니다.
- 시작 1: 인덱스 1부터 선택합니다.
- 끝 5: 인덱스 5는 포함하지 않습니다.
- 간격 2: 두 칸씩 이동하므로 인덱스 1, 3을 선택합니다.
- 각 요소는 필요하지 않으면 생략할 수 있습니다.
- 슬라이싱 결과는 원본과 같은 자료형으로 만들어집니다.
print(nums[1:4])
> [1, 2, 3]
print(nums[:3])
> [0, 1, 2]
# 시작 1, 끝 5, 간격 2를 함께 사용
print(nums[1:5:2])
> [1, 3]
print(myBook[1:3])
> ('Python for Data Analysis', '웨스 맥키니')
리스트·튜플: 무엇을 선택할까?
- 변경하면 안 되는 원본·좌표·설정값
- 불변이라 실수로 수정하는 일을 방지
- 항목 변경이 필요 없다면 먼저 고려
- 계속 추가·수정·삭제할 작업 데이터
- 다양한 변경 메서드 제공
- 분석 과정에서 내용이 바뀌면 적합
fixed_numbers = tuple(numbers) # 리스트 → 튜플
editable_numbers = list(fixed_numbers) # 튜플 → 리스트
리스트·튜플: TypeError와 IndexError
리스트와 튜플을 사용할 때 자주 만나는 오류의 종류와 발생 원인을 예제로 확인합니다.
TypeError
서로 다른 자료형끼리 연산하거나, 불변(immutable) 객체를 수정하려 할 때 발생합니다.
IndexError
리스트나 튜플의 유효한 인덱스 범위를 벗어난 위치에 접근하려 할 때 발생합니다.
# 인덱스는 0부터 시작 → 유효 범위: 0, 1, 2
print(items[3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
오류 메시지 확인: 마지막 줄의 오류 종류(IndexError)와 발생 원인(list index out of range)을 확인합니다.
리스트: 원하는 위치에 넣고 빼기
리스트는 원하는 위치에 값을 넣거나, 특정 위치의 값을 꺼내면서 삭제할 수 있습니다.
- insert(위치, 값): 지정한 인덱스에 값을 삽입합니다.
- pop(위치): 지정한 인덱스의 값을 꺼내면서 삭제합니다. (인자 없으면 마지막)
- index(값): 값이 있는 첫 번째 인덱스를 반환합니다.
- count(값): 리스트에서 값이 등장하는 횟수를 셉니다.
# 1 번 위치에 15 삽입
nums.insert(1, 15)
print(nums)
> [10, 15, 20, 30, 20, 40]
# 마지막 값 꺼내기
last = nums.pop()
print(last, nums)
> 40 [10, 15, 20, 30, 20]
# 20 이 있는 첫 번째 위치 찾기
print(nums.index(20))
> 2
# 20 이 등장하는 횟수 세기
print(nums.count(20))
> 1
리스트: 얕은 복사와 깊은 복사
단순 리스트는 슬라이싱으로 복사할 수 있지만, 중첩 리스트의 내부 항목까지 완전히 분리하려면 깊은 복사가 필요합니다.
- 얕은 복사: 바깥 리스트만 새로 만들고 내부 리스트는 공유합니다.
- 깊은 복사: 내부 리스트까지 모두 새 객체로 복제합니다.
scores = [[80, 90], [70, 85]]
shallow = scores[:] # 얕은 복사
deep = copy.deepcopy(scores) # 깊은 복사
shallow[0][0] = 100
print(scores)
> [[100, 90], [70, 85]]
deep[1][0] = 0
print(scores)
> [[100, 90], [70, 85]]
딕셔너리: 키 - 값 쌍으로 데이터 관리
이름표 (키)를 붙여
데이터를 꺼내는 사물함입니다.
- 중괄호 { } 와 키 : 값 쌍으로 만듭니다.
- 키를 사용해 값을 추가, 조회, 삭제할 수 있습니다.
- 키는 중복될 수 없으며, 값은 어떤 타입도 가능합니다.
student = {
"name": "김철수",
"age": 22,
"major": "소프트웨어"
}
# 키로 값 조회
print(student["name"])
> 김철수
# 키로 값 추가/수정
student["grade"] = 3.5
print(student)
딕셔너리: 메서드로 안전하게 다루기
딕셔너리는 존재하지 않는 키로 접근하면 에러가 납니다. 안전한 메서드를 사용하세요.
- get(키): 키가 없으면 None 을 반환합니다. (에러 없음)
- get(키, 기본값): 키가 없으면 기본값을 반환합니다.
- keys(): 모든 키를 반환합니다.
- values(): 모든 값을 반환합니다.
- items(): 모든 (키, 값) 쌍을 반환합니다.
- del 딕셔너리 [키]: 키 - 값 쌍을 삭제합니다.
# get(키): 존재하는 키 조회
print(student.get("name"))
> 김철수
# get(키): 없는 키는 None 반환
print(student.get("grade"))
> None
# get(키, 기본값): 없는 키는 기본값 반환
print(student.get("grade", 0))
> 0
# keys(): 모든 키 확인
print(student.keys())
> dict_keys(['name', 'age'])
# values(): 모든 값 확인
print(student.values())
> dict_values(['김철수', 22])
# items(): 모든 (키, 값) 쌍 확인
print(student.items())
> dict_items([('name', '김철수'), ('age', 22)])
# del: 키 - 값 쌍 삭제
del student["age"]
print(student)
> {'name': '김철수'}
딕셔너리: 전체 항목 순회하기
딕셔너리를 순회하면
기본적으로 키를 꺼냅니다.
- for key in 딕셔너리: 키를 하나씩 순회합니다.
- items(): 각 항목을 (키, 값) 튜플로 반환합니다.
- for key, value in ...: 튜플을 즉시 언패킹합니다.
- 조건문을 결합하면 원하는 항목만 추출할 수 있습니다.
for key in family:
print(key, family[key])
> 안나 12
> 신후 9
> 우진 2
for key, value in family.items():
if value < 10:
print(key)
> 신후
> 우진
3주 차 실습 및 퀴즈
코랩(Colab)으로 직접 코딩하고, LXP 퀴즈로 학습 내용을 점검하기
[실습 1] 입력받아 연산하고 출력하기
사용자로부터 두 정수를 입력받아 int()로 변환한 뒤, 나누기·몫·나머지를 출력합니다.
수행 목표
- input()으로 데이터 입력받기
- int()를 이용해 문자를 숫자로 변환하기
- /, //, % 연산자로 나누기·몫·나머지 확인하기
- 0으로 나눌 수 없음을 이해하고, 두 번째 수에는 0이 아닌 값 입력하기
실습 가이드 코드
num1 = input("첫 번째 숫자: ")
num2 = input("두 번째 숫자: ")
n1 = int(num1)
n2 = int(num2)
# 2. 연산 및 출력
print("나누기:", n1 / n2)
print("몫:", n1 // n2)
print("나머지:", n1 % n2)
[실습 2] 리스트 조작과 딕셔너리 활용
리스트에 항목을 추가/삭제/삽입하고, 딕셔너리로 데이터를 관리하는 실습을 합니다.
수행 목표
- 리스트 append(), insert(), pop() 메서드 활용
- 딕셔너리 생성 및 키 - 값 조회/추가/삭제
- get(), keys(), values() 메서드 실습
실습 가이드 코드
items = ["사과", "바나나"]
items.append("포도")
items.insert(1, "오렌지")
last = items.pop()
print(items, last)
# 2. 딕셔너리 활용
person = {"name": "홍길동", "age": 30}
person["city"] = "서울"
print(person.get("city"))
print(person.keys())
del person["age"]
실습 및 LXP 퀴즈 안내
실습 1 실행
코랩(Colab)에서 두 숫자를 입력받아 나누기, 몫, 나머지를 출력해 봅니다. 두 번째 숫자는 0이 아닌 값으로 입력하세요.
실습 2 실행
리스트의 추가·삽입·삭제와 딕셔너리의 조회·추가·삭제 코드를 실행하고 결과를 확인합니다.
LXP 퀴즈 풀기
LXP의 [3주 차 퀴즈]에 접속해 수업 내용을 복습한 뒤, 지정된 기한 안에 모든 문항을 풀고 제출합니다.