1. 파이썬 알아보기
파이썬이란?
- 1990년 암스테르담의 귀도 반 로선(Guido Van Rossum)이 개발한 인터프리터 방식의 프로그래밍 언어
- 구글 소프트웨어의 50%이상이 파이썬을 사용
- 드롭박스, 인스타그램, 유튜브등이 파이썬으로 작성됨
- 공동작업과 유지 보수가 쉽다
인터프리터 방식이란?
한줄씩 실행되는 방식
파이썬의 특징
- 인간다운 언어
강점:
- 쉬운 난이도
- 초보 프로그래머들에게 자주 추천됨
- 오픈 소스가 많아 정보 검색이 용이
- 무료지만 강력
- 오픈 소스임으로 어디서든 파이썬 사용 가능
- 개발 속도가 빠름
활용 분야:
- 테이터 크롤링
- 테이터 분석
- 머신 러닝
다른 언어들의 활용 분야:
- C: 속도에 특화된 언어
- Java: 웹, 안드로이드 언어
- Swift: 아이폰 앱
파이썬 설치
공식 싸이트에서 다운보단 필요한 툴들과 함께 패키지 형식으로 제공하는 아나콘다에서 받는걸 추천
아나콘다 링크: https://www.anaconda.com/products/distribution
파이썬 개발 환경
- Jupyter Notebook: 웹 브라우저에서 파이썬 코드를 작성, 실행할 수 있는 개발도구
- Google Colab: 주피터 노트북과 같지만, 협업에 용이함
- Pycharm: 스마트 코드 완성, 코드 검사, 즉성 오류 강조 표시 기능이 추가된 플랫폼
2. 숫자형 자료형
- 숫자 형태로 이루어진 자료형
정수형
1
2
a = 3 # a에 3을 저장
print(a) # print() 출력 명령어
실수형
1
2
a = 3.14 # 소수 형태의 숫자를 a에 저장
print(a)
다른 언어들과 다르게 형변환이 불필요하다
지수 표현
1
2
3
a = 5.15E+10 # 5.15 * 10^10
a = 5.15E10 # +생략 가능
a = 5.15e10 # 소문자 e 가능
연산
- 덧셈 연산: +
- 뺄셈 연산: -
- 곱셈 연산: **
- 나눗셈 연산: /
- 나눈 후나머지: %
- 몫: //
print() 함수 이해하기
- 사용자가 요청한 정보를 화면에 출력해주는 기능
1
2
print('Hello World!') # 헬로 월드 출력
print('Hello World!', end='\n') # end='\n' 가 기본값으로 들어가있어 줄바꿈이 실행된다
1
2
print('Python', 'is', 'too', 'fun!') # Python is too fun! 출력
print('Python', 'is', 'too', 'fun!', sep=' ') # sep=' ' 가 기본값으로 들어가있어 ,마다 띄어쓰기가 실행됨
실습
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#변수 a를 만들고, 변수 a에 정수 5를 할당해보세요.
a = 5
#변수 b를 만들고, 변수 b에 정수 10을 할당해보세요.
b = 10
#두 변수 a,b를 더한 값을 변수 c에 할당해보세요.
c = a+b
#두 변수 a,b를 뺀 값을 변수 d에 할당해보세요.
d = a-b
#두 변수 a,b를 곱한 값을 변수 e에 할당해보세요.
e = a*b
#두 변수 a,b를 나눈 값을 변수 f에 할당해보세요.
f = a/b
#변수 a를 변수 b로 나눈 후, 나머지 값을 g에 할당해보세요.
g = a%b
#변수 b를 변수 a로 나눈 후, 몫을 h에 할당해보세요.
h = b//a
#마지막으로 변수 a~h까지 모두 더한 값을 출력해보세요.
print(a+b+c+d+e+f+g+h)
3. 문자열 자료형
- 문자, 단어 등으로 구성된 문자들의 집합
1
2
3
4
text = 'Hello World'
text = "Hello World"
text = '''Hello World'''
text = """Hello World"""
왜 네가지 방법으로 분류가 되있나?
- 중간에 따옴표를 쓰고 싶을 때 활용 가능
문자열 자료형 표현 방법
1
2
3
4
5
6
7
text = "'Hello' 'World'" # '가 같이 저장됨'
text = "He said \"Hi\" to me" # 백슬래쉬 사용
text = "Life is too short \n You need Python" # \n 줄바꿈 표시
text = """Life is too short
You need Python.
""" # """안에 감싸준다면 줄바꿈도 인식됨
- 이스케이프 코드: 미리 정의 둔 문자조합
문자열 덧셈
1
2
3
4
a = 'Python'
b = 'is too fun!'
print(a + b) # Python is too fun!
문자열 곱셈
1
2
a = 'Python'
print(a*3) # PythonPythonPython
문자열 길이 구하기
1
2
a = 'Python'
print(len(a)) # 6
문자열 인덱싱
1
2
3
a = 'Python'
print(a[0]) # P
print(a[-1]) # n
문자열 슬라이싱
1
2
3
4
a = 'Python is too fun!'
print(a[2:9]) # thon is
print(a[:9]) # Python is
print(a[3:]) # thon is too fun!
문자열 전용 함수: format
1
2
3
4
5
6
7
8
text = "I eat {} apples".format(3)
print(text) # I eat 3 apples
text = "I eat {} apples and {} orages".format(3, 5)
print(text) # I eat 3 apples and 5 oranges
text = "I eat {0} apples and {0} orages".format(3, 5)
print(text) # I eat 3 apples and 3 oranges
15. 예외처리
예외처리를 해야하는 경우
- 내 코드에 아무런 문제가없을 때
- 어디론가 이동할 때
예외처리 기본 구조
1
2
3
4
5
6
try:
수행할 코드
except:
try 문에서 에러가 났을 경우 수행할 코드
finally:
에러와 상관없이 무조건 수행할 코드
에러 일부러 발생시키기
1
raise 에러이름
실습
1
2
3
4
5
6
7
8
9
10
11
12
13
#아래 코드에서 찾았습니다! 가 출력되었을때, 모든 반복문을 강제로 나가는 코드로 수정해보세요.
try:
for n1 in range(1000):
for n2 in range(1000):
for n3 in range(1000):
for n4 in range(1000):
for n5 in range(1000):
if (n1+n2+n3+n4+n5) == 1000:
print("찾았습니다!")
raise NameError
except:
print("에러")
16. 내장함수
- 파이썬에서 기본적으로 제공하는 함수
- print, len과 같이 다방면으로 쓸 수 있는 함수
- append와 같은 함수는 전용함수이다
파일 쓰기/읽기: open
1
2
3
f = open("새파일.txt", 'wt')
f.write("hello")
f.close()
파일 열기 모드 | 설명 |
---|---|
r | 읽기모드 - 파일을 읽기만 할 때 사용 |
w | 쓰기모드 - 파일에 내용을 쓸 때 사용 |
a | 추가모드 - 파일의 마지막에 새로운 내용을 추가 시킬 때 사용 |
abs()
절대값을 리턴
1
2
abs(3) # 3
abs(-3) # 3
all()
모두 참이면 True
1
2
all([1,2,3]) # True
all([1,2,3,0]) # False
any()
하나라도 참이면 ㅆ겯
1
any([1,2,3,0]) # True
divmod()
몫과 나머지 튜플형태로 리턴
1
divmod(7, 3) # (2,1)
enumerate()
리스트, 튜플, 문자열의 위치와 값 반환
1
enumberate(['body', 'foo', 'bar']) #[[0,'body'], [1, 'foo'], [2, 'bar']]
eval()
실행 가능한 문자열을 실행한 결과값을 반환
1
2
3
eval('1+2') # 3
eval("'hi' + 'a'") # 'hia'
eval('divmod(4,3)') # (1,1)
filter()
1
2
3
def positive(x):
return x > 0:
print(list(filter(positive, [1, -3, 2, 0, -5, 6])))
id()
- 주소값을 리턴
1 2
a = 3 id(3) # 135072304
int()
정수 반환
1
2
3
int('3') # 3
int('3.14') # 3
int('11', 2) # 3
len()
길이 반환
list()
리스트 반환
map()
1
2
3
4
def two_times(x):
return x*2
list(map(two_times, [1,2,3,4])) # [1,4,6,8]
max()
최대값 리턴
min()
최소값 리턴
power()
x의 y제곱 리턴
1
pow(2,4) # 16 2**4와 같음
range()
1
list(range(5)) # [0,1,2,3,4]
round()
반올림
1
round(5.678, 2) # 2번째 자리까지 반올림
sorted
정렬
1
2
sorted([3,1,2,]) # [1,2,3]
sorted("zero") # ['e', 'o', 'r', 'z']
tuple()
튜플로 변환
type()
자료형 확인
zip()
동일한 개수로 묶어주는 함수
1
list(zip([1,2,3], [4,5,6])) # [(1,4), (2,5), (3,6)]
17. 라이브러리
- 다른 사람이 만들어 놓은 프로그램을 가져오는 기능
1
2
import 라이브러리 [as 변경이름]
from 라이브러리 import 이름 [as 변경이름]
time
1
2
3
import time
time.time() # 988458015.73417199 # 1970년 1월 1일 오전 0시 0분 0초부터 지금까지 시간
time.ctime() # 'Sat Apr 28 20:56:31 2001'
calendar
1
2
3
import calendar
print(calendar.calendar(2015))
calendar.weekday(2015, 12, 31) # 0이 월요일 -> 3: 목요일
random
1
2
3
4
5
6
7
8
9
10
import random
random.random() # 0~1사이의 아무 숫자
random.randint(1,10) # 1~10사이의 랜덤한 정수 10 포함
data = [1,2,3,4,5]
random.shuffle(data) # 순서를 섞어줌
print(data) #[5,1,3,4,2]
random.sample(data, 3) # 랜덤한 3개 추출
data # [5,3,2]
실습
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#1. time 라이브러리를 가져와서 tm이라는 이름으로 사용하세요.
import time as tm
#2. random 라이브러리로부터 randint함수만 가져오세요.
from random import randint
#3. time 라이브러리를 사용해서 오늘이 무슨 요일인지 화면에 출력해보세요.
print(tm.ctime().split()[0])
#4. random 라이브러리의 randint()함수를 사용하여 1부터 10까지 컴퓨터가 랜덤으로 번호를 갖게하고,
#컴퓨터의 번호를 맞추는 게임을 만들어보세요. (번호를 맞추면 "맞췄습니다!"를 출력하고, 틀리면 "틀렸습니다"가 출력되면 됩니다)
com = randint(1,10)
me = int(input('값 입력:'))
if com == me:
print('맞췄습니다!')
else:
print("틀렸습니다")
18. 수치계산 라이브러리 Numpy 알아보기
- 다차원의 배열 자료구조를 다룰 수 있으며, 벡터와 행렬을 사용하는 선형대수 계산에 주로 사용
np.array
- 행렬 변환
1 2 3
array1 = np.array([1,2,3]) print(type(array1)) # <class 'numpy.ndarray'> print(array1.shape) # (3,) 1차원 데이터 3개
- 병렬계산이 가능해진다
- ex) np.array([1,2,3])+3
1
2
3
array2 = np.array([[1,2,3], [4,5,6]])
print(type(array2)) # <class 'numpy.ndarray'>
print(array2.shape) # (2, 3)
ndim: 차원 확인
1
2
print(array1.ndim) # 1
print(array2.ndim) # 2
데이터 타입 확인 (type(), array.dtype)
1
2
3
4
5
6
list1 = [1,2,3]
print(type(list1)) # <class `list`>
array1 = np.array(list1)
print(type(array1)) # <class 'numpy.ndarray'>
print(array1, array1.dtype) # [1 2 3] int64
행렬을 프린트할때 리스트와는 달리 , 없이
[1 2 3]
처럼 프린트된다
- 주의할 점: 리스트에 문자열과 숫자가 포함되어있다면, 행렬로 변환시에 모두 문자열로 바뀌게 된다
1
2
3
list2 = [1,2,3, 'test']
array2 = np.array(list2)
print(array2, array2.dtype) # ['1' '2' '3' 'test'] <U21
- 마찬가지로 int형과 float형이 섞여있다면 float형으로 모두 변환된다
1
2
3
list3 = [1,2,3,4.0]
array3 = np.array(list3)
print(array3, array3.dtype) # [1. 2. 3. 4.] float64
astype: 데이터 타입 변환
1
2
3
array_int = np.array([1,2,3])
array_float = array_int.astype('float64')
print(array_float, array_float.dtype) # [1. 2. 3.] float64
zeros: 0으로 채워진 행렬 만들기
1
2
3
zero_array = np.zeros((3,2), dtype='int32')
print(zero_array) # [[0 0] [0 0] [0 0]]
print(zero_array.dtype, zero_array.shape) # int32 (3, 2)
ones: 1로 채워진 행렬 만들기
- 1.0인 float형식으로 채워진 행렬 만들어줌
reshpe: 차원 바꾸기
- 개수가 같아야함! (10, 1) -> (2,5)
1 2 3 4 5 6 7 8 9
array1 = np.arange(10) print('array1:\n', array1) # array1: # [0 1 2 3 4 5 6 7 8 9] array2 = array1.reshape(2,5) print('array2:\n', array2) # array2: # [[0 1 2 3 4] # [5 6 7 8 9]]
인덱싱, 슬라이싱
불리언 인덱싱
1
2
3
4
array1d = np.arange(start = 1, stop = 10)
# []안에 array1d > 5 Boolean indexing을 적용
array3 = array1d[array1d > 5]
print('array1d > 5 불린 인덱싱 결과 값:', array3) # array1d > 5 불린 인덱싱 결과 값: [6 7 8 9]
행렬 정렬
1
2
3
4
org_array = np.array([3,1,9,5])
sort_array2 = org_array.sort()
print('org_array.sort() 호출 후 반환된 행렬:', sort_array2) # org_array.sort() 호출 후 반환된 행렬: None
print('org_array.sort() 호출 후 원본 행렬:', org_array) # org_array.sort() 호출 후 원본 행렬: [1 3 5 9]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
array2d = np.array([[8,12], [7,1]])
sort_array2d_axis0 = np.sort(array2d, axis=0)
print('로우 방향으로 정렬: \n', sort_array2d_axis0)
# 로우 방향으로 정렬:
# [[ 7 1]
# [ 8 12]]
array2d = np.array([[8,12], [7,1]])
sort_array2d_axis1 = np.sort(array2d, axis=1)
print('행 방향으로 정렬: \n', sort_array2d_axis1)
# 행 방향으로 정렬:
# [[ 8 12]
# [ 1 7]]
argsort: 정렬된 인덱스를 리턴
1
2
3
org_array = np.array([3,1,9,5])
sort_indices = np.argsort(org_array)
print('행렬 정렬 시 원본 행렬의 인덱스:', sort_indices) # 행렬 정렬 시 원본 행렬의 인덱스: [1 0 3 2]
행렬 내적( np.dot)
1
2
3
4
5
A = np.array([[1,2,3], [4,5,6]])
B = np.array([[7,8], [9,10], [11,12]])
dot_product = np.dot(A,B)
print('행렬 내적 결과: \n', dot_product)
# 행렬 내적 결과: [[ 58 64] [139 154]]
전치 행렬(np.transpose)
1
2
3
4
5
6
A = np.array([[1,2], [3,4]])
transpose_mat = np.transpose(A)
print('A의 전치 행렬:\n', transpose_mat)
# A의 전치 행렬:
# [[1 3]
# [2 4]]