파이썬의 람다식에 대해 알아보자
람다식을 활용하면 코드를 좀 더 간단하고 효율적으로 작성이 가능하다.
lambda
람다 표현식은 식 형태로 되어 있다고 해서 람다 표현(lambda expression)이라고 부른다. 특히 람다식은 함수를 간편하게 작성할 수 있어서 다른 함수의 인수로 넣을 때 주로 사용한다.
사용법
- lambda 인자 : 표현식
다음은 두 수를 더하는 함수이다
1 | def hap(x, y): |
hap(10, 20) -> 30
이것을 람다 표현식으로 바꾸어 보자.
1 | (lambda x, y : x + y)(10, 20) |
30
이렇게 간단하게 한 줄로 표현이 가능하다. 이제 몇 가지 함수를 더 살펴보며 람다의 활용을 보자.
map()
- map(함수, 리스트)
이 함수는 함수와 리스트를 인자로 받는다. 그리고, 리스트로부터 원소를 하나씩 꺼내서 함수를 적용시킨 다음, 그 결과를 새로운 리스트에 담아준다.
다음과 같이 여러개의 정수를 입력받아 정수형의 리스트로 담아내는 것을 간단하게 구현이 가능하다.
1 | nums = list(map(int, input().split())) |
위의 map()함수가 인자로 받은 함수는 정수형으로 형변환을 해주는 int()함수이며 원소는 띄어쓰기를 기준으로 입력받은 문자열 리스트이다. map()함수를 거치며 각 문자열 데이터들은 모두 정수형으로 변환되어 nums 라는 리스트에 저장된다.
다음으로는 람다식을 map()함수에 활용하는 것을 보자.
1 | print(list(map(lambda x : x**2 , range(5)))) |
결과 : [0, 1, 4, 9, 16]
위의 map함수가 인자로 받은 함수는 lambda x : x**2 이며 리스트로는 range(5)를 받았다. 따라서 [0, 1, 2, 3, 4]라는 리스트의 각 원소를 제곱하여 되돌려 준 것이다.
reduce()
- reduce(함수, 순서형 자료)
이 함수는 순서형 자료(문자열, 리스트, 튜플)의 원소들을 누적적으로 함수에 적용시킨다.
파이썬3부터는 import를 해주어야 한다.
1 | from functools import reduce |
결과 : 10
위의 예제는 먼저 0과 1을 더하고, 그 결과에 2를 더하고, 그 결과에 3을 더하고 또 4를 더한 값을 돌려준다.
다음 예제를 보자.
1 | print(reduce(lambda x, y : y + x, 'abcde')) |
결과 : ‘edcba’
여기서 주의해서 보아야 할 것은 x + y 가 아니라 y + x 라는 것이다. 따라서, 처음 a와 b를 인자로 받아 b + a를 수행하므로 ‘ba’ 가 되고 다음 ba와 c를 받아 c + ba를 수행하므로 ‘cba’ 이와 같이 반복하여 ‘edcba’가 되는 것이다.
filter()
- filter(함수, 리스트)
다음은 filter 함수이다. filter()함수는 리스트에 들어있는 원소들을 함수에 적용시켜서 결과가 참인 값들로 새로운 리스트를 만들어준다.
다음 예제는 0~9의 리스트에서 5보다 작은 수만 돌려주는 예제이다.
1 | nums = list(filter(lambda x : x < 5, range(10))) |
결과 : [0, 1, 2, 3, 4]
0~9까지의 숫자를 하나씩 꺼내어 그 숫자를 x라 하고 x < 5 의 조건이 ‘참’이면 돌려주고 ‘거짓’이면 버려 ‘참’인 원소들만 새로운 리스트에 넣어준다.
간단한 예제를 하나 더 보겠다.
1 | nums = list(filter(lambda x : x % 2, range(10))) |
0~9의 리스트 중 홀수만 돌려주는 예제이다. % 연산자는 나머지를 구해주는 연산자이므로 2로 나눈 나머지가 1이면 ‘참’이므로 살리고 0이면 ‘거짓’이므로 나머지가 1인 원소만 즉, 홀수만 살아남아 돌려받게 된다.
여기까지 lambda식과 lambda와 함께 사용하는 함수들을 간단히 알아보았다.
참조
https://wikidocs.net/64
https://dojang.io/mod/page/view.php?id=2359