Simplifying complexity
int, float 같은 간단한 type은 비교적 손쉽게 계산할 수 있음 BUT 이런 값들이 많이 모여서 이루어진 값을 다루는 것은 쉽지 않음 e.g. list를 이용하여 행렬을 표현하고 곱셈을 계산하는 것
따라서 컴퓨터 이미지와 같은 복잡한 대상을 다루기 위해서는 특별한 방법이 필요함 마치 컴퓨터의 기본 type인것 처럼 다루도록..
abstraction in python
- type is either primitive or user-defined
- operators such as + or * computes new values
- methods such as append() can either change the value or produce a new value
- user-defined types can be associated with existing operators by defining specially named methods such as _add_
construction example
1
2
3
4
5
class Vector:
def __init__(self,lst):
self.vec = lst
x = Vector([1,2,3])
x
<_main_.Vector at 0x29ec1a5e7f0>
vector: lst라는 것을 넣는것으로 정의함
displaying value
1
2
3
4
5
6
7
class Vector:
def __init__(self,lst):
self.vec = lst
def __repr__(self):
return "Vector"
x = Vector([1,2,3])
print(x)
Vector
1
2
3
4
5
class Vector:
def __repr__(self):
return "Vector({0})".format(self.vec)
x = Vector([1,2,3])
print(x)
Vector[1, 2, 3]
1
2
3
4
5
6
7
class Vector:
def __init__(self,lst):
self.vec = lst
def __repr__(self):
return "Vector(" + str(self.vec) + ")"
x = Vector([1,2,3])
print(x)
Vector([1, 2, 3])
이제 완벽한건가…?
놉
1
2
3
4
5
6
7
class Vector:
def __init__(self,lst):
self.vec = lst
def __repr__(self):
return "Vector(" + str(self.vec) + ")"
x = Vector((1,2,3))
print(x)
Vector((1, 2, 3))
x에 tuple을 넣었더니 모양이 이렇게 나와버림..?
1
2
3
4
5
6
7
class Vector:
def __init__(self,lst):
self.vec = lst
def __repr__(self):
return "Vector(" + str(self.vec) + ")"
x = Vector(range(10))
print(x)
Vector(range(0, 10))
range(10)을 넣었으면 Vector([0,1,2,3,4,5,6,7,8,9]) 나올줄 알았는데..? 뭐가 들어오든지 간에 list로 바꿔야함 self.vec에는 무조건 리스트만 들어갈 수 밖에 없도록 만들었더니 통일됨
1
2
3
4
5
6
7
class Vector:
def __init__(self,lst):
self.vec = list(lst) #무조건 list로 형변환
def __repr__(self):
return "Vector(" + str(self.vec) + ")"
x = Vector(range(10))
print(x)
Vector([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
아규먼트{}와 format으로 더 깔끔하게 표현
{0} : 0번째 아규먼트 {1} : 1번째 아규먼트
1
2
3
4
5
6
7
class Vector:
def __init__(self,lst):
self.vec = list(lst)
def __repr__(self):
return "Vector({0})".format(self.vec)
x = Vector(range(10))
print(x)
Vector([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
1
2
3
4
5
6
7
class Vector:
def __init__(self,lst):
self.vec = list(lst)
def __repr__(self):
return "Vector({0},{1})".format(self.vec,1)
x = Vector(range(10))
print(x)
Vector([0, 1, 2, 3, 4, 5, 6, 7, 8, 9],1)
1
2
3
4
5
6
7
class Vector:
def __init__(self,lst):
self.vec = list(lst)
def __repr__(self):
return "Vector({1},{0})".format(self.vec,1)
x = Vector(range(10))
print(x)
Vector(1,[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
size of a vector
1
2
3
4
5
6
7
8
9
10
import math
class Vector:
def __init__(self,lst):
self.vec = list(lst)
def __repr__(self):
return "Vector({})".format(self.vec)
def size(self):
return math.sqrt(sum([x**2 for x in self.vec]))
x = Vector((1,1))
print(x.size())
1.4142135623730951
adding two vectors
자기자신은 self라는 이름을 주로 많이 사용하고 첫번째로 가고 다른애는 other라는 이름을 많이 씀
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import math
class Vector:
def __init__(self,lst):
self.vec = list(lst)
def __repr__(self):
return "Vector({})".format(self.vec)
def __add__(self,other):
x = self.vec
y = other.vec
return Vector([x[i] + y[i] for i in range(len(self.vec))])
def size(self):
return math.sqrt(sum([x**2 for x in self.vec]))
x = Vector((1,1))
y = Vector([1,2])
print(x+y)
Vector([2, 3])
두 백터의 len이 다르면 더할 수 없음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import math
class Vector:
def __init__(self,lst):
self.vec = list(lst)
def __repr__(self):
return "Vector({})".format(self.vec)
def __add__(self,other):
x = self.vec
y = other.vec
return Vector([x[i] + y[i] for i in range(len(self.vec))])
def size(self):
return math.sqrt(sum([x**2 for x in self.vec]))
x = Vector((1,1))
y = Vector([1,2,3])
print(y+x)
IndexError: list index out of range
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import math
class Vector:
def __init__(self,lst):
self.vec = list(lst)
def __repr__(self):
return "Vector({})".format(self.vec)
def __add__(self,other):
x = self.vec
y = other.vec
if len(x) != len(y):
print("Error")
return None
return Vector([x[i] + y[i] for i in range(len(self.vec))])
def size(self):
return math.sqrt(sum([x**2 for x in self.vec]))
x = Vector((1,1))
y = Vector([1,2,3])
print(y+x)
Error None
subtracting two vectors
빼기를 구현하자 (기본연산 구현되어 있찌 않으면 TypeError: unsupported operand type(s) for -: ‘Vector’ and ‘Vector’ 에러남
1
2
__sub__라는 특별한 이름의 메소드를 만들어보쟈
__add__에서 +를 -로 바꿈
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import math
class Vector:
def __init__(self,lst):
self.vec = list(lst)
def __repr__(self):
return "Vector({})".format(self.vec)
def __add__(self,other):
x = self.vec
y = other.vec
if len(x) != len(y):
print("Error")
return None
return Vector([x[i] + y[i] for i in range(len(self.vec))])
def __sub__(self,other):
x = self.vec
y = other.vec
if len(x) != len(y):
print("Error")
return None
return Vector([x[i] - y[i] for i in range(len(self.vec))])
def size(self):
return math.sqrt(sum([x**2 for x in self.vec]))
x = Vector((1,1,0))
y = Vector([1,2,3])
print(x-y)
Vector([0, -1, -3])
distance of two vectors
v1 = (1,0,4,4) v2 = (1,2,2,1)
v1v2 distance = sqrt((1-1)^2 + (2-0)^2 + (2-4)^2 + (1-4)^2)
문자 classification
문자 인식의 주요 원리는 숫자 주변에 네모칸을 치고 네개로 나눔, 각 칸을 1234 번호 붙이고 1사분면 안에 까만 점이 있는지 확인, 2사분면에 있는지 확인… 줄줄이 확인하고 (1,0,1,1) 같은식으로 표현하는 것임 또는 점이 몇개에 있는지 (2,0,1,3) 확인해서 그걸 기준으로 인식 칸을 더 마니 나누면 더 조밀한 기준이 세워지며 실수로 찍힌 점도 무시할 수 있게됨