[python] 람다(lambda) 표현

김서연·2023년 8월 27일

python

목록 보기
1/4

lambda 표현식

간단한 함수를 일회성으로 표현할 수 있다.

lambda 함수는 코딩테스트 문제 사이트에서 다른 사람들의 답안에서 흔히 볼 수 있는 문법이다. 필자 또한 다른 사람들의 코드에서 자주 봐왔고, 복잡하고 어려워 보여 쉽게 도전해보지 못했던 문법이었다.

하지만 한 번 이해해보니 다른 함수와 응용하여 어려운 문제도 쉽게 해결할 수 있는, 활용도가 높은 매력적인 문법이라 느꼈다.

또한 lambda 표현은 단순히 가독성 향상코드의 간결함 뿐만 아니라, 메모리 절약이라는 장점이 있어 꼭 알아야 할 필수적인 개념이다.

그럼 함께 lambda의 개념과 응용 방법에 대해 공부하고 정리해 보자!


일반적인 함수 정의 방식과 lambda 표현

def func(x) :
	return x+1

위 방식은 우리가 일반적으로 알고 있는 함수 정의 방식으로, def 키워드를 이용한 리터럴 표기법에 따른 함수 생성 방법이다.

이때 리터럴 표기법을 따른다는 것은 파이썬에서 함수 또한 클래스를 통해 생성된 객체 인스턴스이며, 변수에 들어갈 수 있는 리터럴이기 때문이다.

이때 정의하는 함수가 단 한 번 사용될 함수라면, 그 함수를 만들기 위해 함수(function) 클래스를 호출하는 일련의 과정은 불필요한 메모리 낭비를 하게되는 셈이다.

이러한 낭비를 방지하기 위해 일회성으로 사용될 가벼운 함수를 아래와 같이 lambda를 이용해 표현해줄 수 있다.

>>> lambda x : x+1
>>> (lambda x : x+1)(5)
6

lambda는 일회성 함수를 간단히 표현하기 위한 것이므로 여러번 호출하기 위해서는 아래와 같이 정의와 동시에 변수에 담아줘야 한다.

>>> func = lambda x : x+1
>>> func(5)
6

다른 함수와의 응용

0. 이때 쓰이는 파이썬의 자료형

1. iterable

  • 반복 가능한 객체를 뜻한다.
  • list, dict, set, str, bytes, tuple, range
  • 특히 lambda 함수를 응용할 때 자주 나오는 개념이다. 기억해두자.

2. sequence

  • int 타입 인덱스를 통해 원소에 접근할 수 있는 iterable
  • iterable의 하위 개념
  • list, str, tuple

1. map(function, iterable)

  • map 함수는 iterable 객체로부터 원소를 하나씩 꺼내서 function의 매개변수로 함수를 수행하게 한다. 그리고 수행 결과인 return 값을 묶어 map 객체로 변환한다.
>>> list(map(lambda x: x ** 2, range(5)))
[0, 1, 4, 9, 16]

>>> list(map(int, ['1', '2', '3']))
[1, 2, 3]
  • 위 코드의 수행 결과를 보면 range(5), 즉 0부터 1, 2, 3, 4의 숫자가 들었을 range 객체의 원소를 lambda 함수가 제곱하여 0, 1, 4, 9, 16의 숫자가 된 결과를 볼 수 있다.
  • 또한 map 함수는 iterable 객체의 모든 원소의 자료형을 바꿀 때도 유용하게 쓸 수 있다.

2. reduce(function, sequence)

  • sequence 객체를 돌면서 데이터 속 각각의 값에 대해 function을 실행
  • 이때 function은 대체로 매개변수 두 개를 받는다.
  • 인덱스 0과 1에 대해 function을 수행 후, 그 결과와 인덱스 2에 대해 또 다시 function을 수행하고, 마지막 인덱스까지 반복적으로 함수를 실행하여 하나의 결과를 출력한다.
>>> from functools import reduce
>>> reduce(lambda x, y : x + y, [0, 1, 2, 3, 4])
10

>>> reduce(lambda x, y: y + x, 'abcde')
'edcba'
  • 첫 번째 예제의 경우 lambda 함수가 매개변수 x, y를 더한다. list 자료형인 객체는 reduce 함수에 의해 0+1, (0+1)+2, (1+2)+3, (3+3)+4와 같이 반복된 계산을 수행하고, 그 결과로 10이라는 정수를 출력하게 된다.
  • 두 번째 예제의 경우 앞 상황과 유사하게 매개변수 x와 y를 더하지만, 그 순서가 반대이다. 따라서 str 자료형인 객체는 'b'+'a', 'c'+'ba', 'd'+'cba', 'e'+'dcba'와 같이 계산을 수행하고, 'edcba'라는 결과를 출력한다.

3. filter(function, iterable)

  • filter 함수는 map 함수와 비슷하지만, function 객체의 return 결과가 True, 즉 참인 값만 모아 새로운 filter 객체를 반환한다.
>>> list(filter(lambda x: x, [0,0,1,2]))
[1, 2]

>>> list(filter(lambda x: x < 5, range(10)))
[0, 1, 2, 3, 4]
  • 첫 번째 예제는 lambda 함수가 매개변수의 값을 그대로 return한다. list 객체 속 값 중에서 False 값은 0, 0 이기에 이를 제외한 1, 2만을 반환한다.
  • 두 번째 예제는 lambda 함수가 매개변수 x가 5 미만인지 아닌지, 즉 True 혹은 False 값을 반환하는 조건식을 return 한다. 이때 0, 1, ... 8, 9 라는 값을 갖는 range 객체에서는 5보다 작은 값인 0, 1, 2, 3, 4를 반환하게 된다.

참고 자료

profile
가보자고! 🔥

0개의 댓글