변수
변수란 말 그대로 '변할 수 있는 값'을 의미하며, 파이썬에서의 변수는 객체의 메모리 주소를 가리킨다.
- 파이썬은 모든 것을 객체로 취급한다.
변수 만들기
- 변수를 만들거나, 값을 변경할 때 대입(=할당, assignment)을 사용한다.
- 변수 이름 규칙은 다음과 같다.
- 문자, 숫자, _를 이용하여 생성할 수 있으나, 숫자를 변수명 맨 앞에 둘 수 없다.
- _(밑줄)은 변수명 맨 앞에 둘 수 있다.
- 대소문자를 구분한다.
- 특수문자(!, &, * 등)와 예약어(for, while, and 등)는 변수명으로 사용할 수 없다.
- 공백 및 연산자(*, % 등)는 사용할 수 없다.
변수 생성
a = 10
a
10
- 파이썬은 따로 타입(int, float, string 등)을 적을 필요 없이 '변수명 = 값'으로 변수를 생성한다.
- 아래와 같이 변수에는 숫자 말고 문자도 넣을 수 있다.
b = 'string'
b
string
변수 값 변경
a = 10
a = 'string'
a
string
- 간단하게 대입 기호(=)를 이용하여 바꾸려는 값으로 변경하면 된다.
변수가 가리키는 객체의 주소 확인
a = 10
id(a)
2745997197840
- 변수 a가 가리키는 객체의 메모리 주소는 id 함수를 이용하여 확인할 수 있다.
변수 값 복사하기
a = 10
b = a
print(a) # print는 값을 출력하는 함수
print(b)
10
10
- 간단하게 대입 기호를 사용하여 '새로운 변수 = 기존 변수명'으로 복사할 수 있다.
자료형
변수가 저장하는 데이터의 종류를 말한다.
숫자형
- 숫자형은 크게 정수형(integer)과 실수형(real number)으로 나누어진다.
정수형
a = 10 # 양의 정수
a = -10 # 음의 정수
a = 0 # 0
실수형
a = 3.141592
a = 3141592e-6 # 지수 표현1
a = 3141592E-6 # 지수 표현2
숫자형 연산
사칙연산
a = 6
b = 3
print(a + b) # 덧셈
print(a - b) # 뺄셈
print(a * b) # 곱셈
print(a / b) # 나눗셈
9 # 덧셈
3 # 뺄셈
18 # 곱셈
2.0 # 나눗셈
거듭제곱
a = 6
b = 3
print(a ** b) # 거듭제곱 연산자 **
216 # 6^3
나머지와 몫
a = 6
b = 4
print(a % b) # 나머지 연산자 %
print(a // b) # 몫 연산자 //
2 # 나머지
1 # 몫
문자열 자료형
- 문자의 집합을 문자열이라고 한다.
- 문자열은 작은 따옴표(') 혹은 큰 따옴표(")로 둘러싸인다.
- 큰 따옴표(") 안에 작은 따옴표('), 작은 따옴표(') 안에 큰 따옴표("), 백슬래시(\)를 이용하여 내부에 다른 따옴표를 문자로 표기할 수 있다.
- 파이썬은 문자열에 대한 연산을 지원한다.
문자열을 생성하는 방식
"hello world" # 큰 따옴표(") 이용하기
'hello world' # 작은 따옴표(') 이용하기
"""hello world""" # 큰 따옴표(") 3개 이용하기
'''hello world''' # 작은 따옴표(') 3개 이용하기
- 문자열은 위와 같이 총 4가지 방법으로 생성할 수 있다.
- 따옴표를 3개 사용하는 방식은 여러 줄로 이루어진 긴 문자열을 생성할 때 사용한다.
따옴표 안에 다른 따옴표 포함하기
a = " python's world " # 큰 따옴표(") 안에 작은 따옴표(')
b = ' python is "good" ' # 작은 따옴표(') 안에 큰 따옴표(")
c = " python\'s world " # 백슬래시(\) 이용
print(a)
print(b)
print(c)
python's world
python is "good"
python's world
여러 줄 작성하기
a = " python's world\n python is 'good' " # \n 사용
b = """ python's world
python is 'good' """ # 따옴표 3개 사용
print(a)
print(b)
python's world
python is 'good'
python's world
python is 'good'
문자열 연산
문자열 더하기
a = "python"
b = " is good"
print(a + b)
python is good
문자열 곱하기
a = "python"
print(a * 3)
pythonpythonpython
문자열 인덱싱/슬라이싱
a = "python"
print(a[0]) # 인덱싱 -> 0번 인덱스의 문자
print(a[0:3]) # 슬라이싱 -> 0번 인덱스에서 2번 인덱스까지의 문자열
p
pyt
- 문자열 자료형은 immutable 객체이므로, 인덱싱 및 슬라이싱을 통한 값의 변경이 불가능하다.
- 모든 인덱스는 0번부터 시작함에 유의하자. (첫 번째 원소 = 0번 인덱스 원소)
문자열 포매팅
- 문자열에서 문자는 같은데, 숫자를 다르게 하고 싶을 때 문자열 포매팅 기법을 이용한다.
- 이것은 꽤 알아야 하는 부분이 많으므로 다음 사이트 참고
문자열 자료형 관련 메서드
# 문자열 길이 반환 함수 len
a = "Python is Good"
# 문자열 길이 반환 함수 len
print(len(a))
14
# 문자열 내 특정 문자 개수 반환 함수 count
a = "Python is Good"
# 문자열 내 특정 문자 개수 반환 함수 count
print(a.count('o'))
3
# 문자열 내 특정 문자의 인덱스 반환 함수 find
a = "Python is Good"
# 문자열 내 특정 문자의 인덱스 반환 함수 find
print(a.find('y')) # 없을 시 -1 반환
1
# 문자열 내 특정 문자의 인덱스 반환 함수 index
a = "Python is Good"
# 문자열 내 특정 문자의 인덱스 반환 함수 index
print(a.index('y')) # 없을 시 오류 발생
1
# 대문자 변환 함수 upper
a = "Python is Good"
# 대문자 변환 함수 upper
print(a.upper())
PYTHON IS GOOD
# 소문자 변환 함수 lower
a = "Python is Good"
# 소문자 변환 함수 lower
print(a.lower())
python is good
# 문자열 삽입 함수 join
a = "Python is Good"
# 문자열 삽입 함수 join
print("/".join(a))
P/y/t/h/o/n/ /i/s/ /G/o/o/d
# 문자열 교체 함수 replace
a = "Python is Good"
# 문자열 교체 함수 replace
print(a.replace("Good", "Bad"))
Python is Bad
# 문자열 나누기 함수 split
a = "Python is Good"
# 문자열 나누기 함수 split
p, q, r = a.split() # 공백을 기준으로 나누기
print(p, ",", q, ",", r)
Python , is , Good
# 시작 문자열 확인 함수 startswith()
a = "PythonisGood"
# 시작 문자열 확인 함수 startswith()
tf1 = a.startswith('Python')
tf2 = a.startswith('C++')
print(f'tf1 : {tf1}')
print(f'tf2 : {tf2}')
tf1 : True
tf2 : False
리스트 자료형 (List)
- 파이썬이 기본으로 제공하는 리스트는 연결리스트(Linked List) 자료구조이다.
- 연결리스트는 원소들이 실제 메모리 공간에 연속적으로 배열된다.
리스트 만들기
- 리스트는 대괄호([ ]) 혹은 list()를 이용하여 생성할 수 있다.
# 빈리스트 만들기
a = list()
b = []
# 리스트에 원소 초기화하기
c = list([1, 2, 3, 4])
d = [1, 2, 3, 4]
# 리스트에 리스트를 원소로 포함하기
e = [1, 2, [3, 4]]
# 다른 타입 원소 갖기
f = [1, 2, "hello", "world"]
리스트 원소 접근하기
- 리스트 원소는 메모리에 연속적으로 배열되어 있어 인덱스를 이용하여 접근할 수 있다.
- 리스트 원소에 접근하여 값을 변경하거나 제거할 수 있다.
리스트 인덱싱
a = [1, 2, 3, 4]
a[1]
2
리스트 슬라이싱
a = [1, 2, 3, 4]
a[1:3]
[2, 3]
리스트 원소 수정
a = [1, 2, 3, 4]
a[1] = 10
print(a)
[1, 10, 3, 4]
리스트 원소 삭제
a = [1, 2, 3, 4]
del a[2] # 슬라이싱 사용 가능
print(a)
[1, 2, 4]
리스트 연산
a = [1, 2, 3, 4]
print(a + [5, 6, 7, 8])
print(a * 2)
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 1, 2, 3, 4]
- 리스트는 더하기 연산과 곱하기 연산이 가능하다.
리스트 관련 메서드
# 원소 추가하기 append
a = [2, 1, 4, 3]
# 원소 추가하기 append
a.append(5) # 리스트 또는 다른 타입도 추가 가능
print(a)
[2, 1, 4, 3, 5]
# 리스트 정렬하기(작은 숫자 순) sort
a = [2, 1, 4, 3]
# 리스트 정렬하기(작은 숫자 순) sort
a.sort()
print(a)
[1, 2, 3, 4]
# 리스트 정렬하기(큰 숫자 순) sort
a = [2, 1, 4, 3]
# 리스트 정렬하기(큰 숫자 순) sort
a.sort(reverse=True)
print(a)
[4, 3, 2, 1]
# 리스트 뒤집기 reverse
a = [2, 1, 4, 3]
# 리스트 뒤집기 reverse
a.reverse()
print(a)
[3, 4, 1, 2]
# 리스트의 특정 인덱스 위치에 원소 삽입 insert
a = [2, 1, 4, 3]
# 리스트의 특정 인덱스 위치에 원소 삽입 insert
a.insert(1, 10) # 1번 인덱스에 원소 10 삽입
print(a)
[2, 10, 1, 4, 3]
# 리스트의 특정 원소 제거 (가장 먼저 나오는 원소를 1개 제거) remove
a = [2, 1, 4, 3]
# 리스트의 특정 원소 제거 (가장 먼저 나오는 원소를 1개 제거) remove
a.remove(1)
print(a)
[2, 4, 3]
# 리스트 원소 꺼내기 pop
a = [2, 1, 4, 3]
# 리스트 맨 위 원소 꺼내기
print(a.pop())
print(a)
a = [2, 1, 4, 3]
# 인덱싱을 통해 원소 꺼내기
print(a.pop(2))
print(a)
3
[2, 1, 4]
4
[2, 1, 3]
# 리스트 원소의 인덱스 반환하기 index
a = [2, 1, 4, 3]
# 리스트 원소의 인덱스 반환하기 index
print(a.index(2)) # 값이 없으면 오류 발생
0
# 리스트 내 특정 원소 개수 세기 count
a = [2, 1, 4, 3]
# 리스트 내 특정 원소 개수 세기 count
print(a.count(1))
1
# 리스트 확장하기 extent
a = [1, 2, 3, 4, 5]
# 리스트 확장하기 extent
a += [6, 7] # a = a + [6, 7]
print(a)
a.extend([8, 9]) # 위와 동일
print(a)
[1, 2, 3, 4, 6, 7]
[1, 2, 3, 4, 6, 7, 8, 9]
# 문자열이 담긴 리스트 원소 연결하기 join
a = ["Python", "is", "good"]
# str을 기준으로 문자열 합치기 join
print(''.join(a)) # 공백 없이 합치기
print(','.join(a)) # 중간에 문자열 넣고 합치기
Pythonisgood
Python,is,good
리스트 컴프리헨션
- 간단하게 리스트를 초기화할 수 있는 방법이다.
- 2차원 리스트를 초기화할 때 매우 효과적으로 이용할 수 있다.
- 2차원 리스트를 초기화할 때는 반드시 컴프리헨션을 이용해야 각 행이 서로 다른 참조를 할 수 있다.
# 홀수만 포함하는 리스트
a = [i for i in range(10) if i % 2 == 1]
print(a)
# 2차원 리스트 초기화
b = [[0] * 3 for _ in range(2)]
print(b)
b[0][0] = 1 # 각 행의 서로 다른 참조 확인
print(b)
[1, 3, 5, 7, 9]
[[0, 0, 0], [0, 0, 0]]
[[1, 0, 0], [0, 0, 0]]
리스트 복사하기
a = [10, 20, 30, 40]
b = a
print(a)
print(b)
[10, 20, 30, 40]
[10, 20, 30, 40]
주의) 얕은 복사
- 파이썬에서 mutable한 객체(list, set 등)를 복사하는 경우 '얕은 복사(Shallow Copy)'가 이루어진다.
- 얕은 복사란 같은 메모리 공간을 참조하도록 하는 복사 방식이다.
- 반면에 immutable한 객체(int, float 등)는 복사를 하면 참조가 변경되기 때문에 얕은 복사를 고려하지 않아도 무관하다.
- 얕은 복사는 동일한 참조를 하므로, a의 값이 변경되면 b의 값도 변경된다.
a = [10, 20, 30, 40]
b = a
print(a)
print(b)
a[0] = 100
print(a)
print(b)
[10, 20, 30, 40]
[10, 20, 30, 40]
[100, 20, 30, 40]
[100, 20, 30, 40]
- 원소의 값이 변경되더라도 b는 a와 동일한 메모리 공간을 참조하기 때문에 값이 같이 변하게 된다.
- 리스트를 복사할 때 아예 새로운 메모리 공간을 참조하도록 하려면 '깊은 복사(Deep Copy)'를 이용하여야 한다.
깊은 복사 (Deep Copy)
- 깊은 복사는 copy 모듈의 deepcopy 함수를 이용하여 구현할 수 있다.
- copy 모듈은 내장 라이브러리가 아니기 때문에 맨 처음에 불러와야 함에 유의하자.
import copy
a = [10, 20, 30, 40]
b = copy.deepcopy(a)
print(a)
print(b)
a[0] = 100
print(a)
print(b)
[10, 20, 30, 40]
[10, 20, 30, 40]
[100, 20, 30, 40]
[10, 20, 30, 40]
튜플 자료형 (tuple)
- 리스트와 비슷한 자료형이지만, 리스트와 달리 원소 값을 변경할 수 없다.
- 리스트에서 사용 가능한 메서드 중에서 삭제/수정 메서드를 제외하고는 거의 동일하게 튜플에서도 사용할 수 있다.
튜플 만들기
- 튜플을 만드는 방법은 3가지이다.
- 소괄호 ( ) 이용하기
- tuple() 메서드 이용하기
- 괄호 없이 원소 나열하기
# 소괄호 이용하기
a = (1, 2, 3)
# tuple() 메서드 이용하기
b = tuple([1, 2, 3])
# 원소만 나열하기
c = 1, 2, 3
print(a, type(a))
print(b, type(b))
print(c, type(c))
(1, 2, 3) <class 'tuple'>
(1, 2, 3) <class 'tuple'>
(1, 2, 3) <class 'tuple'>
딕셔너리 자료형 (Dictionrary)
- 키(key)와 값(value)의 쌍을 데이터로 갖는 자료형 ▶ 연관 배열(Associative Array) 또는 해시(Hash)
- immutable한 데이터(숫자형, 문자열, 튜플 등)를 key로 사용할 수 있다.
- 데이터가 순차적으로 저장되어 있지 않기 때문에 리스트와 튜플과 달리 인덱싱/슬라이싱이 불가능하다.
- 대신 딕셔너리 자료형은 key를 이용하여 값을 조회한다.
- key에 해당하는 값을 바로 조회하기 때문에, 검색/수정하는 속도가 빠르다. ▶ 데이터 검색/수정: O(1)
- # O(n)란 빅-오 표기법(Big-O)으로 나타내는 알고리즘의 시간복잡도이다.
딕셔너리 만들기
- 중괄호 {} 또는 dict() 함수를 통해 생성할 수 있다.
- 왼쪽에 있는 값이 key, 오른쪽에 있는 값이 value이다.
- key는 중복될 수 없기 때문에, 중복된 key가 존재하는 경우 1개를 제외한 나머지 요소는 무시된다.
dict_1 = {'a':1, 'b':2, 'c':3} # 딕셔너리 선언1 -> 중괄호 {}
dict_2 = dict(a=1, b=2, c=3) # 딕셔너리 선언2 -> dict() 함수
print(dict_1)
print(dict_2)
{'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'b': 2, 'c': 3}
딕셔너리 요소 조회하기
- 인덱싱을 할 때와 비슷하며, 인덱스 대신 key 값을 넣으면 된다.
dict_1 = {'a':1, 'b':2, 'c':3}
dict_1['a']
1
in 연산자
- 파이썬에서는 iterable 자료형에 대해 in 연산자를 지원하여, 이를 통해 특정 원소를 찾을 수 있다.
- 값이 존재하면 True, 없다면 False를 반환한다.
- 혹은 in 연산자를 이용하여 iterable 자료형의 요소를 나열할 수 있다.
dict_1 = {'a':1, 'b':2, 'c':3}
# 사전 내의 key 값으로 'b'가 있는지 찾음
if 'b' in dict_1:
print('true') # key값으로 'b'가 있으면 true
else:
print('false') # 없으면 false
true
딕셔너리 요소 추가하기
- 대괄호 [] 안에 key 값을 넣고, value 값을 매핑하면 된다.
dict_1 = {'a':1, 'b':2, 'c':3}
dict_1['d'] = 4 # 요소 추가하기
print(dict_1)
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
딕셔너리 요소 삭제하기
- del 함수를 이용한다.
dict_1 = {'a':1, 'b':2, 'c':3}
del dict_1['c'] # 요소 삭제
print(dict_1)
{'a': 1, 'b': 2}
딕셔너리 관련 메서드
# key 데이터 뽑기 함수 keys
dict_1 = {'a':1, 'b':2, 'c':3}
# key 데이터 뽑기 함수 keys
print(dict_1.keys())
dict_keys(['a', 'b', 'c'])
# value 데이터 뽑기 함수 values
dict_1 = {'a':1, 'b':2, 'c':3}
# value 데이터 뽑기 함수 values
print(dict_1.values())
dict_values([1, 2, 3])
# key, value 쌍 추출 함수 items
dict_1 = {'a':1, 'b':2, 'c':3}
# key, value 쌍 추출 함수 items
print(dict_1.items())
dict_items([('a', 1), ('b', 2), ('c', 3)])
# key 값으로 value 값을 얻는 함수 get
dict_1 = {'a':1, 'b':2, 'c':3}
# key 값으로 value 값을 얻는 함수 get
print(dict_1.get('b'))
print(dict_1.get('d')) # 값이 없으면 None 반환
print(dict_1.get('d', 'False')) # 값이 없을 때의 출력을 미리 정할 수 있음
# 간단히 대괄호[] 를 이용하여 추출 가능 (대신 매칭되는 값이 없으면 오류 발생)
print(dict_1['a'])
2
None
False
1
# key, value 쌍 모두 지우기 함수 clear
dict_1 = {'a':1, 'b':2, 'c':3}
# key, value 쌍 모두 지우기 함수 clear
dict_1.clear()
print(dict_1)
{}
셋 자료형 (Set)
- 집합 자료형이라고도 한다.
- 중복을 허용하지 않으며, 순서가 없는 자료형이다. ▶ 중복되는 자료를 찾거나, 필터링 하는 데 유용
- 데이터의 순서가 없어 인덱싱 및 슬라이싱이 불가능하다.
- 데이터를 검색하는 시간이 빠르다. ▶ 데이터 검색 시간 복잡도: O(1)
셋 만들기
- 중괄호{} 또는 set() 함수를 이용하여 생성할 수 있다.
# set() 함수 이용
data1 = set([1, 1, 2, 2, 3, 4, 5, 5, 5])
# 중괄호 {} 이용
data2 = {1, 1, 2, 2, 3, 4, 5, 5, 5}
print(data1)
print(data2)
{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}
셋 자료형 연산
- 셋에 대한 기본적인 연산으로 합집합, 교집합, 차집합 연산이 있다.
data1 = {1, 2, 3, 4, 5}
data2 = {1, 3, 5, 7, 9}
print(data1 | data2) # 합집합 / data1.intersection(data2)와 동일
print(data1 & data2) # 교집합 / data1.union(data2)와 동일
print(data1 - data2) # 차집합 / data1.difference(data2)와 동일
{1, 2, 3, 4, 5, 7, 9}
{1, 3, 5}
{2, 4}
셋 관련 메서드
data1 = {1, 2, 3}
# 요소 추가하기 (1개)
data1.add(4)
print(data1)
# 요소 추가하기 (여러개)
data1.update([5, 6, 7])
print(data1)
# 특정 값 제거하기
data1.remove(4)
print(data1)
{1, 2, 3, 4}
{1, 2, 3, 4, 5, 6, 7}
{1, 2, 3, 5, 6, 7}