# 구조적 프로그래밍
# 1. SRP - Single Responsibility Principle (한 함수는 하나의 책임/기능 만)
# 2. OCP - Open Closed Principle (함수에 대해 기능 확장에는 열려 있고, 코드 변경은 막는다.
결국 OCP를 위해서는 변경되는 코드가 분리되어 파라미터로 전달 되어야 한다.
data = [10, 70, 100, 50]
data2 = [(50,40), (100,60), (70,40)]
data3 = [{'kor':50, 'eng': 40},
{'kor':100, 'eng': 60},
{'kor':70, 'eng': 40}]
# 숫자 리스트 max
def m_max(d):
c = None
for i in d:
if(c == None or c<i):
c = i
return c
print(m_max(data))
# 튜플 리스트 max
def m_max2(d):
c = None
for i in d:
if(c == None or c[0]<i[0]):
c = i
return c
print(m_max2(data2))
# dictionary 리스트 max
def m_max3(d):
c = None
for i in d:
if(c == None or c['eng']<i['eng']):
c = i
return c
print(m_max3(data3))
# 조건 검사 코드를 제외한 동일한 코드가 반복 구현 된다.
# 조건 검사 코드를 일급 함수로 변경 분리해 내서 간략화 할 수 있다.
def fn1(n):
return n
def fn2(n):
return n[0]
def fn3(n):
return n['eng']
def m_max_ocp(d, key):
c = None
for i in d:
if(c == None or key(c)<key(i)):
c = i
return c
print(m_max_ocp(data, fn1))
print(m_max_ocp(data2, fn2))
print(m_max_ocp(data3, fn3))
# 조건 함수가 너무 많아지는 문제 때문에 익명 함수(lambda)를 사용한다.
def m_max_ocp(d, key):
c = None
for i in d:
if(c == None or key(c)<key(i)):
c = i
return c
print(m_max_ocp(data, lambda n : n))
print(m_max_ocp(data2, lambda n : n[0]))
print(m_max_ocp(data3, lambda n : n['eng']))
s = lambda a, b : a+b
print(s(10, 20))
# default 값으로도 제공 가능하다.
def m_max_ocp(d, key=lambda n:n):
c = None
for i in d:
if(c == None or key(c)<key(i)):
c = i
return c
print(m_max_ocp(data))
print(m_max_ocp(data2, lambda n : n[0]))
print(m_max_ocp(data3, lambda n : n['eng']))
내장 함수들도 동일하게 lambda를 사용.
data1 = [10, 70, 100, 50]
data2 = [(50,40), (100,60), (70,40)]
data3 = [{'kor':50, 'eng': 40},
{'kor':100, 'eng': 60},
{'kor':70, 'eng': 40}]
print(max(data1))
print(max(data2, key=lambda n:n[0]))
print(max(data3, key=lambda n:n['eng']))
f = filter(lambda n:n>40, data1)
print(f) # <filter object at 0x01E21B30> generator 임
for n in f:
print(n)
def myfilter(key, dt) :
return (n for n in dt if key(n)) # ()는 generator
f = myfilter(lambda n:n>40, data1)
print(f)
for n in f:
print(n)
m = map(lambda n:n*2, data1) # 개별 데이터에 대해 연산 설정
print (list(m))
(내장 리스트로도 가능)
s = sorted(data1) # 새 객체 생성print(s)
# data1 자체 정렬은 data1.sort()
s = sorted(data1, reverse=True)
print(s)
s = sorted(data2, key=lambda n:n[1])
print(s)
s = sorted(data3, key=lambda n:n['eng'])
print(s)
s = sorted(data3, key=lambda n:n['kor'], reverse=True)
s = s[0:2] # 상위 2개 뽑아 냄.
print([n['kor'] for n in s ])
import statistics
def mysum(key, dt):
return sum([key(n) for n in dt])
s = sum(data1)
print(s)
s = sum([n[0] for n in data2])
print(s)
s = mysum(key=lambda n:n[0], dt = data2)
print(s)
s = sum([n['eng'] for n in data3])
print(s)
a = statistics.mean(data1)
print(a)
md = statistics.stdev(data1)
print(md)
a = statistics.mean([n['eng'] for n in data3])
print(a)
댓글 없음:
댓글 쓰기