Python
1. 기본 특성
- 인터프리터 언어(성능이 느리다) 성능 향상을 위해 NumPy lib을 사용하기도 한다.
- 간략화된 문법(배우기가 쉽다)
- 배열이 없다.
- ML 관련 유명 라이브러리
- Numpy
- Pandas(데이터 join)
- 크롤링
- Matplotlib(그래프)
- 문자와 문자열 구분이 없다. (문자열은 Linked List 형태로 저장)
- Operator
hello = 'hello'
world = 'world'
hello_wordl = hello + ', ' + world
# 링크드 리스트 연결이 됨
2. Tool
2.1 Jupyter notebook
- Python을 실행해 볼수 있는 간단한 에디터
- 아나콘다 설치 시 같이 설치가 된다.
2.2 PyCharm
프로젝트 생성 방법
File
->New Project
-
more
메뉴 클릭 -
미리 설치한
interpreter
를 선택 -
create
클릭 -
File
->Python File
- 코드 작성 후
run
을 하기 위해서Alt
+Shift
+F10
3. Python 문법
3.1 문자열
s = 'Good morning'
s[0:4] # 'Good'
s[-1] # 'g' 맨 마지막 글자
s[2:] # 'od morning'
s[:5] # 'Good '
len(s) # 12 , 문자열 길이
#Format api
a = 'My name is {}. I am {} years old'.format('Mario', 20)
# 'My name is Mario. I am 20 years old'
e = '%10.3f'%(323.323323323) # ' 323.323'
'{:10.3f}'.format(323.3233232323) # ' 323.323'
3.2 자료구조
3.2.1 List
참고로 List는 Linked List 를 사용한다. 대용량 데이터를 처리 할 때 느리다.
a = ['jone' , 'kim', 'aaa']
b = b = [ 1, 2.0, 'kim', True, False] # 타입에 구애 받지 않는다.
b[2:] # ['kim', True, False] #String 과 마찬가지로 슬라이싱이 가능하다.
a + b # ['jone', 'kim', 'aaa', 1, 2.0, 'kim', True, False]
a * 2 + b * 1 # ['jone', 'kim', 'aaa', 'jone', 'kim', 'aaa', 1, 2.0, 'kim', True, False]
a.pop() # 'aaa'
a = [5, 4, 1, 0]
a.sort()
a # [0,1,4,5]
3.2.2 Tuple
List와 비슷하나 수정이 불가능 하다.
a = (1,2,3,4) # 소괄호 생략 가능
type(a) # tuple
a[1] = 10 # Error 발생
b = 1, # 원소가 하나인 경우
type(b) # tuple
# 패킹
a = 1,2,3
one, two ,three = a
#언패킹
one # 1
two # 2
three # 3
# 패킹, 언패킹은 List에서도 동일하게 적용이 된다.
name, age, address = 'kim', 30 , 'seoul'
3.2.3 Dictionary
- Key 값과 Value를 쌍으로 저장
- Key는 Set으로 구현이 되어있고 Value는 Collection으로 구현이 되어 있다.
data = {'name' : 'Kim', 'age' : 30, 'address' : 'seoul'}
data['age'] # 30
data['height'] = 180 # 새로운 값 삽입
data.keys() ## dict_keys(['name', 'age', 'address', 'height'])
data.values() ## dict_values(['Kim', 30, 'seoul', 180])
data.items() ## dict_items([('name', 'Kim'), ('age', 30), ('address', 'seoul'), ('height', 180)])
3.2.4 Set
- 저장된 순서 보장하지 않는다.
- 접근 속도가 빠르다.
- 중복을 허용하지 않는다.
setA = {11, 1 ,2 ,3 ,3 ,11}
type(setA) ## set
setA #{1, 2, 3, 11}
3.3 흐름 제어
None
: 값이 없음(empty)을 의미
3.3.1 코드 블록(Code Block)
- 여러 코드가 이루는 일정한 구역
python은 들여쓰기로 구분 되기 때문에 들여쓰기를 유의해서 작성하자
print('수를 입력하시오')
a = int(input())
if a == 0:
print('0은 나눗셈에 이용할 수 없습니다.')
else :
print('3/', a, '=', 3/a)
num = int(input('숫자를 입력하시오'))
if (num > 90) :
print('num >90')
elif (num > 80):
print('num >80')
else :
print('num<=80')
3.3.2 반복문
for
반복변수
in순서열
:코드 블록
순서열
은List
,Tuple
,Dictionary
가 될수 있다.
for i in ['one', 'two', 'three', 'for'] :
print(i)
for i in 'name', 'age', 'address' :
print(i)
# (초기값, 종료값, 증강값)
for i in range(0,10,1) :
print(i)
# 초기값, 증강값 생략 가능
for i in range(7) :
print(i)
dic = {'애플' : 'www.apple.com',
'파이썬' : 'www.python.org',
'마이크로소프트' : 'www.microsoft.com'}
for k,v in dic.items() :
print('{} : {}'.format(k,v))
3.4 함수
- 함수를 정의할 때
def
키워드를 사용한다.
def hello() :
print('hello')
def add(a,b) :
return a +b
add(10,20) #30
add ('hello ' , 'world') # hello world
def print_personnel(name, position = 'staff', nationality = 'Korea') :
print('name = {}'.format(name))
print('position = {}'.format(position))
print('nationality = {}'.format(nationality))
print_personnel(name = '박상현')
# name = 박상현
# position = staff
# nationality = Korea
print_personnel(name = '박상현', position = '인턴')
# name = 박상현
# position = 인턴
# nationality = Korea
# 인자의 순서도 변경 가능
print_personnel(position = '인턴', name = '박상현' )
# name = 박상현
# position = 인턴
# nationality = Korea
Python은 리턴 타입을 명시 하지 않는다. 왜냐하면 변수 자체에 타입이 없기 때문 함수 인자 타입에 따른 함수 오버로드도 의미가 없다. 함수 인자도 타입이 없기 때문
3.4.1 가변 매개변수
def add (*data) :
result = 0
for d in data :
result += d
return result
add(4,5,1) #10
add(2,3) # 5
def print_team(**players) :
for k in players.keys() :
print('{} = {}'.format(k, players[k]))
print_team(카시야스='GK', 호날두='FW', 알론소='MF', 페페='DF')
# 카시야스 = GK
# 호날두 = FW
# 알론소 = MF
# 페페 = DF
3.4.2 함수 포인터
def plus(a,b) :
return a + b
def minus(a,b) :
return a- b
func = [plus, minus]
func[0](2,3) # 5
func[1](2,3) # -1
def hello_korean() :
print('안녕하세요')
def hello_english() :
print('hello')
def get_greeting(where) :
if where == 'K' :
return hello_korean
else :
return hello_english
hello = get_greeting('K')
hello() # 안녕하세요
hello = get_greeting('E')
hello() # hello
3.5 객제 지향 프로그래밍
3.5.1 생성자
class Car :
# 생성자는 __init__
# 자기 자신(this)은 self
def __init__(self):
print('init call')
self.color = 'RED'
self.wheel_size = 16
self.displacement = 2000
def info_print(self) :
print('color : {}, wheel size : {}'.format (self.color, self.wheel_size))
a = Car() # init call
a.info_print() # color : RED, wheel size : 16
만약 맴버 변수를 __init__
이 아닌 바깥 스코프에 선언하면 어떻게 동작할까?
class InstanceC :
text_list = []
def __init__(self) :
print('init')
def add(self, text):
self.text_list.append(text)
def print_list(self) :
print(self.text_list)
a = InstanceC()
a.add('kim')
a.print_list() # ['kim']
b = InstanceC()
b.add('Lee')
b.print_list() # ['kim', 'Lee']
# text_list 가 static 으로 동작한다.
- 위 코드를 아래와 같이 수정하면 의도대로 동작한다.
class InstanceC :
def __init__(self) :
self.text_list = []
print('init')
def add(self, text):
self.text_list.append(text)
def print_list(self) :
print(self.text_list)
a = InstanceC()
a.add('kim')
a.print_list() # ['kim']
b = InstanceC()
b.add('Lee')
b.print_list() # ['Lee']
3.5.2 Class Private Member
class HasPrivate :
def __init__(self) :
self.pubValue = 'public value'
self.__priValue = 'private value'
def print_data(self) :
print(self.pubValue)
print(self.__priValue)
obj = HasPrivate()
obj.print_data()
# public value
# private value
obj.pubValue
obj.__priValue # error 발생!!
3.5.3 Inheritance
class AA :
def __init__(self):
print('AA init call')
class BB(AA) :
def __init__(self):
print('BB init call')
bb = BB() # BB init call
- 위 코드와 같이 부모 클래스의 생성자를 명시적으로 호출하지 않으면 자식 클래스의 생성자만 호출이 된다. 귀찮더라도 아래와 같이 부모 생성자를 꼭 호출하도록 하자
class BB(AA) :
def __init__(self):
super().__init__()
print('BB init call')
bb = BB()
# AA init call
# BB init call
3.6 Iteration
iterator = range(3).__iter__()
iterator.__next__() # 0
iterator.__next__() # 1
iterator.__next__() # 2
iterator.__next__() # exception!!
3.6.1 Custom Iteration
class MyRange:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.current < self.end :
current = self.current;
self.current += 1
return current
else :
raise StopIteration()
for i in MyRange(0,5):
print(i) # o 1 2 3 4
3.7 Generator
def YourRange(start, end):
current = start
while current <end:
yield current
current += 1
return
for i in YourRange(0,5) :
print(i)
3.8 Iterator
3.8.1 Comprehension
result = []
# For loop 방식
for i in range(10) :
result.append(i)
print(result)
# Comprehension 방식
result2 = [i for i in range(10)]
print(result2)
result3 = []
for i in range(10) :
if i % 2 == 0 :
result3.append(i)
print(result3)
result4 = [i for i in range(10) if i %2 ==0]
print(result4)
result5 =[]
# else 문이 사용할 경우 if else 문을 앞에서 선언해야 한다.
result5 = [i if i %2 ==0 else 10 for i in range(10) ]
print(result5)
# [0, 10, 2, 10, 4, 10, 6, 10, 8, 10]
data1 = 'hello'
data2 = 'world'
result6 = [i+j for i in data1 for j in data2 if not (i==j)]
print(result6)
words = 'the quick brown for jumps over the lazy dog'.split()
print(words)
result7 = [[w.upper(), w.lower(), len(w) ] for w in words]
print(result7)
Compression 방식을 사용하면 가독성이 떨어지지만 처리 속도가 빨라진다.
3.8.2 Emurate
for i,v in enumerate(data) :
print(i,v)
str = 'Team is an academic institude located in south korea'.split()
result = {i:j for i,j in enumerate(str)}
print(result)
3.8.3 Zip
a = (1,2,3)
b = 10,20,30
c = 100, 200, 300
result2 = [x+y+z for x,y,z in zip(a,b,c)]
print(result2)
# x는 tuple로 받고 x를 sum 함수를 통해 tuple의 합을 구한다.
result3 = [sum(x) for x in zip(a,b,c)]
print(result3)
3.9 File 입출력
3.9.1 File read/write 기본
file = open('text.txt', 'w')
file.write('hello')
file.close()
file2 = open('text.txt', 'r')
str = file2.read()
print(str)
file2.close()
3.9.2 Iterator 사용
def displayForLoop(file) :
infile = open(file, 'r')
for line in infile :
print(line, end= '')
infile.close()
def displayWithComprehension(file) :
infile = open(file,'r')
# new line 제거
listData = [line.rstrip() for line in infile]
infile.close()
return listData
filepath = 'FirstPresidents.txt'
displayForLoop(filepath)
print(displayWithComprehension(filepath))
3.9.3 file을 list로 read 한 후 정렬한다음 write
def readListFromFile(file) :
infile = open(file,'r')
# new line 제거
listData = [line for line in infile]
infile.close()
return listData
def writeListToFile(list, file) :
outfile = open(file + '_sorted','w')
outfile.writelines(list) # 한번에 list를 write 할 수 있음
outfile.close()
file = 'States.txt'
list = readListFromFile(file)
list.sort()
writeListToFile(list,file)
3.10 집합 API(Set)
infile = open('File1.txt', 'r')
firstSet = {line for line in infile}
infile.close()
infile = open('File2.txt', 'r')
secondSet = {line for line in infile}
infile.close()
# 합집합
outfile = open('Union.txt', 'w')
outfile.writelines(firstSet.union(secondSet))
# 교집합
outfile = open('Intersection.txt', 'w')
outfile.writelines(firstSet.intersection(secondSet))
# 차집합
outfile = open('Difference.txt', 'w')
outfile.writelines(firstSet.difference(secondSet))
3.11 Lambda
#람다 식을 이용해 함수를 축약해서 사용 가능하다.
f = lambda x,y : x+y
def f2(x,y) :
return x+ y
print(f(10,20))
print(f2(10,20))
ex = [1,2,3,4,5]
print(list(map(lambda x:x**2, ex)))
3.12 바이너리 파일
3.12.1 pack(), unpack()
import struct
packed = struct.pack('i', 256) # data => bytes
# integer는 4byte이고 byte 단위로 출력한다.
for i in packed:
print(i)
unpacked = struct.unpack('i',packed) # bytes => tuple(data)
print(unpacked) # (256,)
3.12.2 Pickle library
- Pickle library를 이용하여 쉽게 바이너리 파일을 read/write 할 수 있다.
import pickle
outfile = open('list.pickle', 'wb')
data = [1,2,3,4,5]
pickle.dump(data,outfile)
outfile.close()
infile = open('list.pickle', 'rb')
rData = pickle.load(infile)
print(rData)
댓글남기기