AIFFEL에서 배운 lambda와 first-class object를 정리해보자.
람다 함수, 익명 함수 : 람다로 작성한 함수
# 람다 함수 생성식
( lambda parameter : return value ) ( argument )
코드 한줄로 함수를 생성할 수 있다.
함수를 인수로 전달하는 코드를 작성할 때 자주 사용
메모리 효율성
다른 함수들은 변수와의 할당을 통해서 함수 생성, 변수 할당은 메모리 공간을 차지하는 것을 의미, 한번 밖에 사용 안 할 함수가 메모리 공간을 차지하는 것은 비효율적
def add_two(x):
return x+2
add_two(5)
( lambda x : x + 2 ) ( 5 )
아주 간단하게 생성과 인자 전달이 일어나는 것을 볼 수 있다.
또한, 람다 함수는 함수의 이름이 없기 때문에 익명 함수라고 불리기도 한다.
이름을 부여할 수 있다. 그러나 부여한다면, 메모리 효율의 장점이 사라지는 것과 마찬가지다.
add_two = ( lambda x : x + 2 )
print(add_two(5))
람다 함수의 장점 중 하나인, 인자 전달을 보자
map ( 적용할 함수 , 대입할 iterable 객체 )
코드가 좀 더 간단해진 것을 볼 수 있다.
filter( 적용할 함수 , 대입할 iterable 객체 )
즉, Bool 값을 원할 때 사용하면 좋다.
# 누적자 초기값의 default는 0이다.
reduce( 집계 함수 , iterable 객체 [ , 누적자의 초기값 ] )
집계함수는 무조건 두 개의 인자를 필요로 한다.
reduce 함수가 이해가 됐다면, 이 결과를 이해할 수 있을 것이다.
x가 누적자, y가 현재값이므로, 이런 방식으로 동작하게 된다.
sorted( iterable 객체 [ , key 옵션] [ , reverse 옵션 ]
일단, iterable한 객체에서 element를 꺼내 my_key에 인자 전달
거기서 나온 key값을 기준으로 sort 실행
이제 sorted에 대해 알아봤으니 구현해보자.
Q) 그렇다면, 이제 함수를 사용할 필요는 없는 것일까?
A) 두가지 정도의 문제가 있다.
1. 추가 호출 불가
람다 함수는 이름이 없기 때문에 추가 호출을 위해서라면 다시 lambda 표현식으로 구현해야 한다.
→ 변수에 할당하면 해결되긴 한다.
2. 함수 내에 새로운 변수를 생성할 수 없다.
람다식 자체가 인자 할당 부분과 return 부분을 제외한 모든 부분을 생략했기에 변수 생성 불가
but, 외부에 있는 변수를 불러올 수 있다.
사실 원래는 일급 객체도 범위에 들어가지만, closure랑 연결되는 것이 좋을 것 같아 넘긴다.