익명함수 : 메모리를 아끼고 가독성을 향상시킨다.
일반적인 함수는 객체를 만드록 , 재사용을 위해 함수 이름을 할당한다.
# (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 함수도 map 과 마찬가지로 함수를 인자로 전달 받는다.
그리고 이 함수는 값을 걸러내는 기준이 된다.
즉 , filter 함수는 값을 걸러내는 기능을 제공하는 함수이다.
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의 배수만 리스트에 담게 된다면 ??
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 함수를 다 사용하게 된다면 ??
st = list(range(1, 11))
fst = list(filter(lambda n: not (n % 3), map(lambda n: n ** 2, st)))
print(fst) # [9, 36, 81]