! 02장에서는 숫자형, 문자열, 리스트, 튜플, 딕셔너리, 집합, 불 자료형 그리고 변수에 대해서 공부했다.
국어
80점, 영어75점, 수학55점을 받은 학생의 평균 점수를 구해 보자.
korean = 80
english = 75
math = 55
average = (korean + english + math) / 3
print(average)
70.0
평균은 모든 점수를 더한 뒤 과목의 개수로 나누면 된다.
80 + 75 + 55
= 210
그리고 과목은 총 3개이므로
210 / 3
= 70.0
이 된다.
파이썬에서
/연산자를 사용하면 나눗셈 결과가 실수형으로 반환된다.
>>> 210 / 3
70.0
평균 = 값들의 합 / 값의 개수
자연수
13이 홀수인지 짝수인지 확인해 보자.
>>> 13 % 2
1
%는 나머지를 구하는 연산자이다.13 ÷ 2
몫 = 6
나머지 = 1
숫자를
2로 나누었을 때 나머지를 확인하면 홀수와 짝수를 구분할 수 있다.
2로 나눈 나머지가 0 → 짝수
2로 나눈 나머지가 1 → 홀수
따라서
13 % 2
의 결과가 1이므로 13은 홀수이다.
>>> 10 % 2
0
10 → 짝수
>>> 7 % 2
1
7 → 홀수
숫자 % 2 == 0 # 짝수
숫자 % 2 == 1 # 홀수
다음과 같은 문자열이 있다고 하자.
pin = "881120-1068234"
각각 나누어서 출력해 보자.
pin = "881120-1068234"
yyyymmdd = pin[:6]
num = pin[7:]
print(yyyymmdd)
print(num)
881120
1068234
문자열은 슬라이싱을 이용해서 원하는 부분만 가져올 수 있다.
문자열의 인덱스를 확인해 보면 다음과 같다.
8 8 1 1 2 0 - 1 0 6 8 2 3 4
0 1 2 3 4 5 6 7 8 9 ...
pin[:6]
은 처음부터 인덱스 6 직전까지 가져온다.
0 ~ 5
↓
881120
pin[7:]
은 인덱스 7부터 문자열의 끝까지 가져온다.
1068234
인덱스
6에는-가 있기 때문에 제외하고7부터 시작한다.
문자열[시작:끝]
시작 → 포함
끝 → 포함하지 않음
앞의 문자열에서 뒷부분의 첫 번째 숫자를 출력해 보자.
pin = "881120-1068234"
print(pin[7])
1
문자열에서 특정 문자 하나를 가져올 때는 인덱싱을 사용한다.
8 8 1 1 2 0 - 1 0 6 8 2 3 4
0 1 2 3 4 5 6 7 8 9 ...
↑
pin[7]
따라서
pin[7]
은 문자 '1'을 반환한다.
여기서 중요한 것은 결과가 숫자형
1이 아니라 문자열'1'이라는 점이다.
>>> type(pin[7])
<class 'str'>
문자열의 특정 위치 하나 → 인덱싱
문자열의 일정 범위 → 슬라이싱
다음 문자열의
:문자를 모두#으로 바꾸어 보자.
a = "a:b:c:d"
replace() 함수를 사용할 수 있다.
a = "a:b:c:d"
b = a.replace(":", "#")
print(b)
a#b#c#d
replace()는 문자열의 특정 값을 다른 값으로 바꾸어 새로운 문자열을 반환한다.
기본 형태는 다음과 같다.
문자열.replace("기존 문자열", "바꿀 문자열")
따라서
a.replace(":", "#")
은
:
를 모두
#
으로 바꾼다.
문자열은 직접 수정할 수 없는 자료형이므로 원래 변수
a자체가 수정되는 것은 아니다.
>>> a
'a:b:c:d'
새로운 결과를 b에 저장한 것이다.
문자열.replace("기존 값", "새로운 값")
다음 리스트를 큰 숫자부터 작은 숫자 순서로 만들어 보자.
a = [1, 3, 5, 4, 2]
먼저 sort()를 사용한다.
a = [1, 3, 5, 4, 2]
a.sort()
print(a)
[1, 2, 3, 4, 5]
이 상태에서
reverse()를 사용한다.
a.reverse()
print(a)
[5, 4, 3, 2, 1]
sort()는 리스트를 기본적으로 오름차순으로 정렬한다.
[1, 3, 5, 4, 2]
↓
sort()
↓
[1, 2, 3, 4, 5]
reverse()는 현재 리스트의 순서를 반대로 뒤집는다.
[1, 2, 3, 4, 5]
↓
reverse()
↓
[5, 4, 3, 2, 1]
한 번에 다음과 같이 작성할 수도 있다.
a = [1, 3, 5, 4, 2]
a.sort(reverse=True)
print(a)
[5, 4, 3, 2, 1]
sort() → 오름차순 정렬
reverse() → 현재 순서를 반대로
sort(reverse=True) → 내림차순 정렬
다음 리스트를 하나의 문장으로 만들어 보자.
a = ['Life', 'is', 'too', 'short']
결과는 다음과 같이 만들고 싶다.
Life is too short
join()을 사용하면 된다.
a = ['Life', 'is', 'too', 'short']
result = " ".join(a)
print(result)
Life is too short
join()은 문자열 사이에 특정 문자를 넣어 하나의 문자열로 연결한다.
" ".join(a)
여기에서
" "
는 공백 한 칸이다.
따라서 다음처럼 연결된다.
Life + " " + is + " " + too + " " + short
결과는
Life is too short
가 된다.
만약
#으로 연결한다면 다음과 같다.
>>> "#".join(a)
'Life#is#too#short'
"연결할 문자".join(리스트)
다음 튜플에 숫자
4를 추가해 보자.
a = (1, 2, 3)
결과는 다음과 같이 만들고 싶다.
(1, 2, 3, 4)
a = (1, 2, 3)
b = a + (4,)
print(b)
(1, 2, 3, 4)
튜플은 값을 직접 수정하거나 추가할 수 없는 불변(immutable) 자료형이다.
따라서 다음처럼 사용할 수 없다.
a.append(4)
튜플에는 append()가 없다.
대신 기존 튜플과 새로운 튜플을
+로 합쳐 새로운 튜플을 생성한다.
a + (4,)
(1, 2, 3) + (4,)
↓
(1, 2, 3, 4)
(4,)에서 쉼표가 필요한 이유요소가 하나뿐인 튜플을 만들 때는 반드시 쉼표
,가 필요하다.
(4,) # 튜플
반면
(4) # 정수
이다.
>>> type((4,))
<class 'tuple'>
>>> type((4))
<class 'int'>
튜플은 수정 X
기존 튜플 + 새로운 튜플
→ 새로운 튜플 생성
다음과 같은 딕셔너리 a가 있다.
a = dict() a >>> {}
a = {}
다음 중 오류가 발생하는 코드를 찾아보자.
a['name'] = 'python'
a[('a',)] = 'python'
a[[1]] = 'python'
a[250] = 'python'
a[[1]] = 'python'
이 코드에서 오류가 발생한다.
TypeError: unhashable type: 'list'
딕셔너리의 Key에는 변경할 수 없는 자료형을 사용할 수 있다.
a['name'] = 'python'
사용 가능 O
a[('a',)] = 'python'
사용 가능 O
a[[1]] = 'python'
사용 불가능 X
a[250] = 'python'
사용 가능 O
간단하게 정리하면 다음과 같다.
| 자료형 | 딕셔너리 Key |
|---|---|
| 문자열 | O |
| 숫자 | O |
| 튜플 | O |
| 리스트 | X |
변경 가능한 리스트 → Key 사용 X
변경 불가능한 문자열, 숫자, 튜플 → Key 사용 가능
다음 딕셔너리에서 Key가
'B'인 값을 꺼내 보자.
a = {
'A': 90,
'B': 80,
'C': 70
}
pop()을 사용할 수 있다.
a = {'A': 90, 'B': 80, 'C': 70}
result = a.pop('B')
print(a)
print(result)
{'A': 90, 'C': 70}
80
pop()은 해당 Key의 Value를 반환하면서 동시에 딕셔너리에서 삭제한다.
a.pop('B')
를 실행하면
'B' : 80
중에서 80을 반환하고 'B' 항목은 딕셔너리에서 사라진다.
실행 전
{
'A': 90,
'B': 80,
'C': 70
}
a.pop('B')
반환값
80
실행 후
{
'A': 90,
'C': 70
}
get()은 값을 가져오기만 하고 삭제하지 않는다.
a.get('B')
반면
a.pop('B')
은 값을 가져오면서 삭제한다.
| 함수 | 값 반환 | 삭제 |
|---|---|---|
get() | O | X |
pop() | O | O |
get() → 가져오기
pop() → 가져오기 + 삭제
다음 리스트에서 중복된 숫자를 제거해 보자.
a = [1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5]
집합 자료형을 이용할 수 있다.
a = [1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5]
a_set = set(a)
result = list(a_set)
print(result)
[1, 2, 3, 4, 5]
집합 자료형의 가장 중요한 특징 중 하나는 중복을 허용하지 않는다는 것이다.
따라서
set(a)
를 실행하면
[1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5]
↓
set()
↓
{1, 2, 3, 4, 5}
가 된다.
다시 리스트가 필요하다면
list()를 사용한다.
list(set(a))
따라서 간단하게 다음과 같이 작성할 수도 있다.
result = list(set(a))
단, 집합은 순서를 보장하지 않는 자료형이기 때문에 원래 리스트의 순서를 반드시 유지해야 하는 경우에는 주의해야 한다.
list(set(리스트))
리스트 → set → 중복 제거 → 다시 리스트
다음 코드를 살펴보자.
a = b = [1, 2, 3]
그리고 a의 두 번째 요소를 변경한다.
a[1] = 4
그 후 b를 출력하면 어떻게 될까?
print(b)
[1, 4, 3]
처음 코드를 보면
a와b에 각각[1, 2, 3]이라는 리스트가 만들어졌다고 생각하기 쉽다.
하지만 실제로는 그렇지 않다.
a = b = [1, 2, 3]
를 실행하면 하나의 리스트 객체를 a와 b가 함께 가리키게 된다.
┌───────────┐
a ─────▶│ [1, 2, 3] │
└───────────┘
▲
│
b ───────────┘
따라서
a[1] = 4
를 실행하면 a만 변경되는 것이 아니라 두 변수가 보고 있는 하나의 리스트 객체 자체가 변경된다.
┌───────────┐
a ─────▶│ [1, 4, 3] │
└───────────┘
▲
│
b ───────────┘
그래서
print(b)
의 결과도
[1, 4, 3]
이 된다.
is를 사용하면 두 변수가 같은 객체를 가리키는지 확인할 수 있다.
>>> a = b = [1, 2, 3]
>>> a is b
True
True이므로 같은 리스트 객체를 가리키고 있다.리스트를 별도로 복사하면 된다.
a = [1, 2, 3]
b = a.copy()
이 상태에서
a[1] = 4
를 실행해 보자.
print(a)
print(b)
[1, 4, 3]
[1, 2, 3]
a만 변경되고 b는 변경되지 않는다.두 변수는 서로 다른 객체를 가리키기 때문이다.
a ─────▶ [1, 4, 3]
b ─────▶ [1, 2, 3]
a = b = [1, 2, 3]
같은 리스트 객체를 가리킴
반면
a = [1, 2, 3]
b = a.copy()
서로 다른 리스트 객체
지금까지 2장에서 배운 내용을 문제를 통해 다시 확인했다.
| 문제 | 핵심 내용 |
|---|---|
| Q1 | 숫자 연산, 평균 계산 |
| Q2 | 나머지 연산자 % |
| Q3 | 문자열 슬라이싱 |
| Q4 | 문자열 인덱싱 |
| Q5 | replace() |
| Q6 | sort(), reverse() |
| Q7 | join() |
| Q8 | 튜플 연산 |
| Q9 | 딕셔너리 Key |
| Q10 | 딕셔너리 pop() |
| Q11 | 집합을 이용한 중복 제거 |
| Q12 | 변수와 객체의 관계 |
! 2장에서 꼭 기억해야 할 내용
숫자
13 % 2
%→ 나머지- 짝수 판별 →
number % 2 == 0
문자열
a[0]→ 인덱싱
a[0:3]→ 슬라이싱
a.replace(":", "#")→ 문자열 변경 결과 생성
리스트
a.sort()→ 정렬
a.reverse()→ 순서 뒤집기
문자열과 리스트
" ".join(a)→ 리스트의 문자열을 하나로 연결
튜플
(1, 2, 3) + (4,)→ 기존 튜플을 수정하는 것이 아니라 새로운 튜플 생성
딕셔너리
a.pop('B')→ 값을 반환하면서 해당 요소 삭제
딕셔너리의 Key에는 리스트처럼 변경 가능한 자료형을 사용할 수 없다.
집합
list(set(a))→ 중복 제거
변수
a = b = [1, 2, 3]→
a와b가 같은 리스트 객체를 가리킨다.따라서
a[1] = 4를 실행하면
b에서도 변경된 값을 확인할 수 있다.
2장에서 가장 중요한 것은 단순히 문법을 외우는 것이 아니라 각 자료형의 특징을 구분하는 것이다.
숫자 → 계산 문자열 → 문자 데이터 리스트 → 순서 O / 수정 O 튜플 → 순서 O / 수정 X 딕셔너리 → Key : Value 집합 → 순서 X / 중복 X 불 → True / False 변수 → 객체를 가리키는 이름이 개념들을 확실하게 이해해 두면 다음 장에서 배우는 if, while, for 제어문도 훨씬 쉽게 이해할 수 있다.