1학년 / 2학기 / AI-R-PY / 1강

2주차: 파이썬 자료형과 컬렉션

이번 강의에서 배울 것

  • 파이썬의 기본 자료형을 구분하고 type()으로 확인할 수 있다.
  • 연산자와 변수를 사용해 값을 계산하고 저장할 수 있다.
  • 문자열과 순차 자료형을 인덱싱·슬라이싱할 수 있다.
  • 리스트의 변경 가능성과 참조·복사의 차이를 설명할 수 있다.
  • 딕셔너리의 키와 값을 이용해 데이터를 조회·수정할 수 있다.

학습 경로

다음: 3주차 · 조건문, 반복문과 함수

범위: 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 + 1060
뺄셈-50 - 1040
곱셈*50 * 10500
나눗셈/50 / 124.166...
몫//50 // 124
나머지%50 % 122
거듭제곱**5 ** 225
hour = 3
minute = 50
 
total_minutes = hour * 60 + minute
print(total_minutes)  # → 230

변수는 값을 가리키는 이름이다. =는 같음을 비교하는 기호가 아니라 오른쪽 값을 왼쪽 이름에 할당하는 연산자다.

PART 2 · 문자열

인덱싱과 슬라이싱

13p~20p

문자열은 문자가 순서대로 놓인 불변 시퀀스다. 인덱스는 0부터 시작하고, 음수 인덱스는 뒤에서부터 센다.

문자MICHAEL␣JACKSON
인덱스01234567891011121314
음수−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()는 원본을 정렬하고 을 돌려준다.
  • 딕셔너리는 위치가 아니라 로 값을 찾는다.
오늘도 한 걸음 앞으로.

내용을 이해했다면 학습 완료를 체크해 주세요.

학습 기록은 현재 브라우저에 저장됩니다.
HJS / STUDY한지석