AIFFEL - Python(5) lambda function

JoBoB·2023년 11월 18일
0

AIFFEL - Python

목록 보기
8/10
post-thumbnail

AIFFEL에서 배운 lambda와 first-class object를 정리해보자.


Lambda (람다)

람다 함수, 익명 함수 : 람다로 작성한 함수

# 람다 함수 생성식
( lambda parameter : return value ) ( argument )

코드 한줄로 함수를 생성할 수 있다.
함수를 인수로 전달하는 코드를 작성할 때 자주 사용

메모리 효율성
다른 함수들은 변수와의 할당을 통해서 함수 생성, 변수 할당은 메모리 공간을 차지하는 것을 의미, 한번 밖에 사용 안 할 함수가 메모리 공간을 차지하는 것은 비효율적


일반 함수 VS 람다 함수

  • 일반 함수로 구현
def add_two(x):
	return x+2
    
add_two(5)
  • lambda 함수로 구현
( lambda x : x + 2 ) ( 5 )

아주 간단하게 생성과 인자 전달이 일어나는 것을 볼 수 있다.
또한, 람다 함수는 함수의 이름이 없기 때문에 익명 함수라고 불리기도 한다.

이름을 부여할 수 있다. 그러나 부여한다면, 메모리 효율의 장점이 사라지는 것과 마찬가지다.

add_two = ( lambda x : x + 2 )

print(add_two(5))

함수를 인자로 전달

람다 함수의 장점 중 하나인, 인자 전달을 보자

1. map()

  • map : iterable 객체의 element들을 function에 집어넣어 함수 실행 결과를 반환
             list(), tuple()로 묶어야만 데이터값을 리턴받을 수 있음 ( 파이썬 3 이상 )
map ( 적용할 함수 , 대입할 iterable 객체 )
  • 함수
  • 람다 함수

코드가 좀 더 간단해진 것을 볼 수 있다.


2. filter()

  • filter : map과 같이 function에 element들을 넣지만, 리턴 값이 True인 애들만 반환
             list(), tuple()로 묶어야만 데이터값을 리턴받을 수 있음 ( 파이썬 3 이상 )
filter( 적용할 함수 , 대입할 iterable 객체 )

즉, Bool 값을 원할 때 사용하면 좋다.

  • 함수
  • 람다 함수

3. reduce()

  • reduce : 여러 개의 데이터를 누적 집계를 내기 위해 사용
# 누적자 초기값의 default는 0이다.
reduce( 집계 함수 , iterable 객체 [ , 누적자의 초기값 ] )

집계함수는 무조건 두 개의 인자를 필요로 한다.

  • 1st para (누적자) : 함수의 시작부터 끝까지 재사용되는 값
  • 2nd para (현재값) : 새로운 인자로 계속해서 바뀌는 값

reduce 함수가 이해가 됐다면, 이 결과를 이해할 수 있을 것이다.

x가 누적자, y가 현재값이므로, 이런 방식으로 동작하게 된다.

  • 함수
  • 람다 함수

4. sorted()

  • sorted : iterable 객체를 새로운 정렬된 리스트로 만들어 반환
sorted( iterable 객체 [ , key 옵션] [ , reverse 옵션 ]
  • key : 어떤 값을 key값으로 정한 후, 그 값에 대해 정렬 ( default는 sort의 key값 )
  • reverse : 오름차순 (False) 내림차순 (True) 결정 ( default는 내림차순 )

일단, iterable한 객체에서 element를 꺼내 my_key에 인자 전달
거기서 나온 key값을 기준으로 sort 실행

이제 sorted에 대해 알아봤으니 구현해보자.

  • 함수
  • 람다 함수

Q) 그렇다면, 이제 함수를 사용할 필요는 없는 것일까?

A) 두가지 정도의 문제가 있다.

1. 추가 호출 불가
람다 함수는 이름이 없기 때문에 추가 호출을 위해서라면 다시 lambda 표현식으로 구현해야 한다.

→ 변수에 할당하면 해결되긴 한다.

2. 함수 내에 새로운 변수를 생성할 수 없다.
람다식 자체가 인자 할당 부분과 return 부분을 제외한 모든 부분을 생략했기에 변수 생성 불가

but, 외부에 있는 변수를 불러올 수 있다.


사실 원래는 일급 객체도 범위에 들어가지만, closure랑 연결되는 것이 좋을 것 같아 넘긴다.

profile
딥러닝을 메인으로 나아가고자 하는 뉴비입니다

0개의 댓글