lambda , map ,filter

BackEnd_Ash.log·2020년 5월 27일
0

파이썬

목록 보기
14/34

lambda

익명함수 : 메모리를 아끼고 가독성을 향상시킨다.
일반적인 함수는 객체를 만드록 , 재사용을 위해 함수 이름을 할당한다.

# (hint) 함수의 입력 값과 출력값을 알려준다.
def func_mul3(x: int) -> list:
    y1 = x * 100
    y2 = x * 200
    y3 = x * 300
    return [y1, y2, y3]


print(func_mul3(5))  # [500, 1000, 1500]


def test(x):
    x1 = x * 100
    x2 = x * 200
    x3 = x * 300
    return [x1, x2, x3]


print(test(4)) # [400, 800, 1200]

람다식

함수를 만들때 고민하게 되는것 중 하나가 naming 이다.
할때마다 고민하게 된다 .
그런데 , 함수의 이름이 크게 의미를 갖지 않는 경우도 있다.
이름 없는 함수를 만들어서 반환하는 방법이 있는데 이것을 그냥 이해하기 편하게 람다라고 하면 좋을것 같다.

ref = lambda s : print(s) # 람다 기반의 함수 정의
print(ref('oh ~')) # oh ~ 

마치 react 에서 화살표 함수랑 비슷한것 같다.

위의 코드를 보면 이름만 없어진게 아니라 , 전체적인 코드도 간결해 진것을 볼 수 있다 .

lambda args : expression

# args 는 매개변수
# expression 은 출력되어지는 몸체

메모리가 절약되며 , 가독성 향상 , 코드가 간결해진다.
함수는 객체 생성 -> 리소스(메모리) 할당
람다는 즉시 실행 (Heap 초기화) -> 메모리 초기화

lambda_mul_10 = lambda num:num * 10
print(lambda_mul_10(10)) # 100

lambda num

중에서 num 이 args 니깐 우선적으로 10 이 담아지게 됩니다.
그리고 나서 expression 부분 이 num * 10 부분이니깐 저 부분이 return 됩니다.

lambda_mul_10 = lambda num : num * 2

def func_final(x , y , func):
	print(x * y * func(2))
func_final(2,2,lambda_mul_10) # 16

print(func_final(10,10,lambda x : x * 3))

다른 예시를 보면

def rev(s):
    return s[::-1]
    
st  = ['one' , 'two' , 'three']
rst = list(map(rev , st))
print(rst) # ['eno', 'owt', 'eerht']

이 코드를 람다식을 이용하면 간결하게 해결 할 수가 있다.

st = ['one' , 'two' ,'three']
rst = list(map(lambda s : s[::-1] , st))
print(rst) # ['eno', 'owt', 'eerht']

filter

filter 함수도 map 과 마찬가지로 함수를 인자로 전달 받는다.
그리고 이 함수는 값을 걸러내는 기준이 된다.
즉 , filter 함수는 값을 걸러내는 기능을 제공하는 함수이다.

2의 배수 filter , lambda

def is_odd(n):
    return n % 2

st = [1,2,3,4,5]
ost = list(filter(is_odd , st))
print(ost) # [1,3,5]

위 코드를 람다식을 이용하게 되면 ?

st = [1, 2, 3, 4, 5]
ost = list(filter(lambda n: n % 2, st))
print(ost) # [1 , 3 , 5 ] 

filter 니깐 해당하는 2의 배수는 걸러서 출력이 됩니다.

10 이하 자연수 중 3의배수 filter , lambda

이번엔 10 이하의 자연수 중에서 3의 배수만 리스트에 담게 된다면 ??

st = list(range(1,11))
fst = list(filter(lambda n : not (n%3) , st))
print(fst) # [3 , 6 , 9]

filter 함수는 걸러주는 함수인데 , 여기서 not 함수를 사용하였다.
not 을 붙이지 않으면 3의 배수를 제외하고 출력할것인데 ,
반대로 not 함수가 있으니 ,
3의 배수가 출력이 된다.

map 과 filter 함수를 다 사용하게 된다면 ??

10 이하 제곱 구하기 lambda

st = list(range(1, 11))
fst = list(filter(lambda n: not (n % 3), map(lambda n: n ** 2, st)))
print(fst)  # [9, 36, 81]
profile
꾸준함이란 ... ?

0개의 댓글