2018년 6월 26일 화요일

Python lambda

# 구조적 프로그래밍 # 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)

댓글 없음:

댓글 쓰기