2주차: 파이썬 자료형과 컬렉션
이번 강의에서 배울 것
- 파이썬의 기본 자료형을 구분하고 type()으로 확인할 수 있다.
- 연산자와 변수를 사용해 값을 계산하고 저장할 수 있다.
- 문자열과 순차 자료형을 인덱싱·슬라이싱할 수 있다.
- 리스트의 변경 가능성과 참조·복사의 차이를 설명할 수 있다.
- 딕셔너리의 키와 값을 이용해 데이터를 조회·수정할 수 있다.
학습 경로
범위: 2주차 슬라이드 3–43
단원 도입
| 핵심 포인트 | 중요도 | 이렇게 확인한다 |
|---|---|---|
슬라이스 [시작:끝]은 끝을 포함하지 않음 | ★★★ | name[0:4]의 결과 쓰기 |
| 변경 가능(리스트·딕셔너리) vs 불가능(문자열·튜플) | ★★★ | 요소 대입이 되는지 판단하기 |
b = a(참조 공유) vs a.copy()(복사) | ★★★ | 한쪽을 바꾼 뒤 다른 쪽의 값 예측하기 |
append vs extend | ★★ | [1, 2]에 각각 [3, 4]를 넣은 결과 |
/, //, %의 차이 | ★★ | 50 / 12, 50 // 12, 50 % 12 계산 |
d[key] vs d.get(key) | ★★ | 키가 없을 때의 결과 |
형광펜 읽는 법: 노랑 핵심 정의·결론 · 빨강 헷갈리기 쉬운 구분·함정 · 파랑 외워야 할 순서·목록
PART 1 · 값 하나 다루기
기본 자료형과 형 변환
3p~5p
파이썬에서 값은 저마다 자료형(type)을 가진다. 자료형은 저장 방식과 사용할 수 있는 연산을 결정한다.
| 자료형 | 의미 | 예시 | 확인 결과 |
|---|---|---|---|
int | 정수 | 15, -2 | <class 'int'> |
float | 실수 | 20.21, 3.0 | <class 'float'> |
str | 문자열 | "R-Py Computing" | <class 'str'> |
bool | 참·거짓 | True, False | <class 'bool'> |
values = [15, 20.21, "R-Py Computing", True]
for value in values:
print(value, type(value))
# → 15 <class 'int'>
# → 20.21 <class 'float'>
# → R-Py Computing <class 'str'>
# → True <class 'bool'>형 변환 함수는 값을 다른 자료형으로 바꾼 새 값을 만든다.
float(3) # → 3.0
int(1.9) # → 1 소수점 아래를 버림 (반올림 아님)
int("1") # → 1
str(3.5) # → '3.5'
int(True) # → 1
bool(0) # → False표현식, 연산자와 변수
6p~12p
표현식(expression)은 값과 연산자를 조합해 새로운 값을 만드는 코드다. 연산 대상은 피연산자, 계산 규칙을 나타내는 기호는 연산자라고 한다.
| 연산 | 연산자 | 예시 | 결과 |
|---|---|---|---|
| 덧셈 | + | 50 + 10 | 60 |
| 뺄셈 | - | 50 - 10 | 40 |
| 곱셈 | * | 50 * 10 | 500 |
| 나눗셈 | / | 50 / 12 | 4.166... |
| 몫 | // | 50 // 12 | 4 |
| 나머지 | % | 50 % 12 | 2 |
| 거듭제곱 | ** | 5 ** 2 | 25 |
hour = 3
minute = 50
total_minutes = hour * 60 + minute
print(total_minutes) # → 230변수는 값을 가리키는 이름이다. =는 같음을 비교하는 기호가 아니라 오른쪽 값을 왼쪽 이름에 할당하는 연산자다.
PART 2 · 문자열
인덱싱과 슬라이싱
13p~20p
문자열은 문자가 순서대로 놓인 불변 시퀀스다. 인덱스는 0부터 시작하고, 음수 인덱스는 뒤에서부터 센다.
| 문자 | M | I | C | H | A | E | L | ␣ | J | A | C | K | S | O | N |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 인덱스 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 음수 | −15 | −2 | −1 |
name = "MICHAEL JACKSON"
print(name[0]) # → M
print(name[-1]) # → N
print(name[0:4]) # → MICH
print(name[8:12]) # → JACK
print(len(name)) # → 15슬라이스 문자열[시작:끝:간격]은 시작 위치를 포함하지만 끝 위치는 포함하지 않는다.
| 표현 | 뜻 | name에 적용 |
|---|---|---|
text[:3] | 처음부터 인덱스 3 직전까지 | MIC |
text[3:] | 인덱스 3부터 끝까지 | HAEL JACKSON |
text[::2] | 처음부터 두 칸씩 건너뛰기 | MCALJCSN |
text[::-1] | 문자열 뒤집기 | NOSKCAJ LEAHCIM |
statement = "Michael Jordan is the best basketball player"
print(statement[18:37]) # → the best basketball문자열 메서드
21p~23p
메서드는 특정 자료형의 값에 연결된 기능이다. 문자열 메서드는 원본 문자열을 바꾸지 않고 결과 문자열을 새로 반환한다.
word = "banana"
print(word.upper()) # → BANANA
print(word.capitalize()) # → Banana
print(word.find("na")) # → 2 처음 나오는 위치
print(word.find("na", 3)) # → 4 인덱스 3부터 찾기
print(word.find("z")) # → -1 없으면 -1
print(word.replace("a", "o")) # → bonono
print(word) # → banana 원본은 그대로dir(word)는 사용할 수 있는 속성과 메서드를, help(str.find)는 사용법을 확인할 때 유용하다.
PART 3 · 여러 값 담기
튜플과 리스트의 공통점·차이점
24p~30p
튜플과 리스트는 여러 값을 순서대로 저장한다. 서로 다른 자료형도 함께 담을 수 있지만, 변경 가능성이 다르다.
| 구분 | 튜플 tuple | 리스트 list |
|---|---|---|
| 표기 | (10, 9, 6) | [10, 9, 6] |
| 순서 | 있음 | 있음 |
| 인덱싱·슬라이싱 | 가능 | 가능 |
| 생성 후 요소 변경 | 불가능 | 가능 |
| 주 용도 | 바뀌지 않을 값의 묶음 | 계속 추가·수정할 데이터 |
ratings = (10, 9, 6, 5)
scores = [10, 9, 6, 5]
print(ratings[1:3]) # → (9, 6)
scores[1] = 8
print(scores) # → [10, 8, 6, 5]
# ratings[1] = 8 # → TypeError: 'tuple' object does not support item assignment요소가 하나뿐인 튜플은 쉼표가 필요하다.
single_tuple = ("A",) # 튜플
not_a_tuple = ("A") # 그냥 문자열 "A" (괄호는 계산 순서 괄호)리스트 메서드와 집계
31p~33p
letters = ["a", "b", "c"]
letters.append("d") # 한 요소를 끝에 추가 → ['a', 'b', 'c', 'd']
letters.extend(["e", "f"]) # 여러 요소를 펼쳐서 추가 → ['a', 'b', 'c', 'd', 'e', 'f']
letters.remove("b") # 값으로 삭제 → ['a', 'c', 'd', 'e', 'f']
last = letters.pop() # 마지막 요소를 꺼내며 삭제 → last = 'f'
letters.sort() # 리스트 자체를 정렬
print(letters, last) # → ['a', 'c', 'd', 'e'] f| 함수·메서드 | 역할 | 원본 변경 여부 |
|---|---|---|
append(x) | x를 요소 하나로 추가 | 변경 |
extend(xs) | 반복 가능한 값의 요소들을 펼쳐 추가 | 변경 |
pop(i) | i 위치 요소를 반환하며 삭제 (생략하면 마지막) | 변경 |
remove(x) | 첫 번째 x를 삭제 | 변경 |
sort() | 리스트 자체를 정렬, None 반환 | 변경 |
sorted(xs) | 정렬된 새 리스트 반환 | 변경 안 함 |
len, min, max, sum | 길이·최솟값·최댓값·합계 계산 | 변경 안 함 |
numbers = [3, 41, 12, 9, 74, 15]
average = sum(numbers) / len(numbers)
print(min(numbers), max(numbers), average) # → 3 74 25.666666666666668리스트 참조와 복사
34p~38p
리스트 변수에는 리스트 자체가 아니라 그 객체를 찾는 참조가 저장된다.
a = ["Banana", 3, 1.5]
b = a # 같은 리스트에 이름표를 하나 더 붙임
b[0] = "Apple"
print(a) # → ['Apple', 3, 1.5] a도 바뀜!
print(a is b) # → True 같은 객체a와 b가 같은 리스트를 가리키므로 한쪽의 수정이 다른 쪽에서도 보인다. 독립적인 얕은 복사본은 슬라이싱 a[:]이나 copy()로 만든다.
a = ["Apple", 3, 1.5]
b = a.copy() # 새 리스트를 만듦
a[0] = "Peach"
print(a) # → ['Peach', 3, 1.5]
print(b) # → ['Apple', 3, 1.5]PART 4 · 딕셔너리
딕셔너리: 키로 값을 찾는 자료형
39p~43p
딕셔너리는 키(key)와 값(value)의 쌍을 저장한다. 키는 중복될 수 없고, 문자열·숫자·튜플처럼 변경 불가능한 값을 사용한다.
student = {
"name": "Jack",
"age": 26,
}
print(student["name"]) # → Jack
print(student.get("age")) # → 26
student["age"] = 27 # 이미 있는 키 → 수정
student["address"] = "Seoul" # 없는 키 → 추가
del student["address"] # 삭제| 표현 | 동작 | 키가 없을 때 |
|---|---|---|
d[key] | 값 조회 | KeyError |
d.get(key) | 값 조회 | None |
d.get(key, default) | 값 조회 | 지정한 기본값 |
key in d | 키 존재 여부 | False |
d.keys() | 모든 키 보기 | 빈 뷰 |
d.values() | 모든 값 보기 | 빈 뷰 |
d.items() | 모든 키·값 쌍 보기 | 빈 뷰 |
for key, value in student.items():
print(key, value)
# → name Jack
# → age 27정답과 해설
1. text[2:4] → 'Py', text[-9:] → 'Computing', text[::-1][:3] → 뒤집으면 'gnitupmoC yP-R'이므로 앞 세 글자 'gni'.
2. [1, 2, 3]. y = x는 복사가 아니라 같은 리스트를 가리키므로 y에 추가한 값이 x에서도 보인다.
3. (가). 튜플은 요소를 바꿀 수 없다. (나)는 새 문자열을 만들어 이름 s에 다시 붙인 것이라 문제없다.
4. d["b"] → KeyError, d.get("b", 0) → 0.
5. 3 in d.values().
플래시카드
2주차 — int(1.9), bool("False"), 10 / 2의 결과는?
1(소수점 버림), True(빈 문자열이 아니므로), 5.0(/는 항상 float).
2주차 — /, //, %의 차이는?
/는 실수 나눗셈, //는 몫(아래로 내림), %는 나머지. 50 / 12 = 4.166…, 50 // 12 = 4, 50 % 12 = 2.
2주차 — 슬라이스 s[2:5]는 어떤 인덱스를 포함하는가?
2, 3, 4. 시작은 포함하고 끝(5)은 포함하지 않는다. 길이는 끝 − 시작 = 3.
2주차 — 변경 가능한 자료형과 불가능한 자료형은?
리스트·딕셔너리는 변경 가능, 문자열·튜플은 변경 불가능. 불가능한 자료형은 요소 대입 시 TypeError.
2주차 — b = a와 b = a.copy()의 차이는?
b = a는 같은 리스트를 공유(한쪽 수정이 다른 쪽에 보임), copy()는 새 리스트를 만든다(얕은 복사, 중첩 리스트는 여전히 공유).
2주차 — append([3, 4])와 extend([3, 4])의 차이는?
append는 [3, 4]를 요소 하나로 넣고, extend는 3과 4를 펼쳐 각각 넣는다.
2주차 — d[key]와 d.get(key)의 차이는?
키가 없을 때 d[key]는 KeyError, d.get(key)는 None(또는 지정한 기본값)을 돌려준다.
핵심 점검
- 문자열과 튜플은 이고, 리스트와 딕셔너리는 이다.
- 슬라이스의 끝 인덱스는 결과에 .
int(1.9)의 결과는 이다.b = a는 리스트 복사가 아니라 같은 객체에 대한 이다.sort()는 원본을 정렬하고 을 돌려준다.- 딕셔너리는 위치가 아니라 로 값을 찾는다.
내용을 이해했다면 학습 완료를 체크해 주세요.