1. 람다식에 대한 기본적인 이해
람다식을 통해 익명함수를 만드는 법에 대해서 알아보자.
람다식은 함수 표현을 간단하게 만들어줄 수 있다. 한 줄 짜리 함수에 많이 사용되는 편이다.
일단 일반 함수와 비교하기 위해 예시를 들도록 하겠다.
def square(x):
return x * x
print(square(4))
>> 16
정사각형의 넓이를 구하는 square다. 이를 아래와 같은 람다식으로 표현할 수 있다.
print((lambda x : x*x)(4))
>> 16
람다식을 재할당하고 싶으면 따로 저장할 수도 있다.
square = (lambda x : x*x)
print(square(4))
>> 16
또한, 한 줄(one-line) 조건문을 사용하여 람다식을 표현하는 것도 가능하다.
아래의 예시를 확인해보자.
print((lambda x : x*x if x < 5 else x*x*2)(4))
>> 16
print((lambda x : x*x if x < 5 else x*x*2)(6))
>> 72
- 위의 출력은 x가 5보다 작았기 때문에 4 * 4 = 16이 나온다.
- 아래는 5보다 큰 6이기때문에 6 * 6 * 2 = 72가 나오는 것이다.
2. map과 함께 쓰이는 람다
아마 알고리즘 문제를 꽤 풀어봤다면 아래의 map이 익숙할 것이다.
map(int, input().split())
map(자료형, 순회 가능한 데이터) 형식으로 생각하는 분들도 있을 것이다.
map을 python documentation에 가서 확인해보면 map(function, iterable, ...)으로 되어있다.
사실 int 자체가 함수이기 때문에 성립가능한 것이다. ex) int("1234") ==> 1234
정리하자면, map(함수, 순회 가능한 데이터)로 입력되는 함수이다.
그러므로 map 안에 람다식을 쓸 수 있다.
** 순회 가능한 데이터의 예시: 리스트, 튜플 등등등..
arr = [1,2,3,4,5]
print(list(map(lambda x:x*x, arr)))
>> [1, 4, 9, 16, 25]
- 람다식에 의해 배열이 각각 제곱되어 반환된다.
3. filter와 함께 쓰이는 람다
filter도 map과 인자는 같다. filter(함수, 순회 가능한 데이터) 형식이다.
웬만하면 불리언 형식을 반환하는 함수와 함께 써야한다.
arr = [i for i in range(20)]
print(list(filter(lambda x: x % 4 == 0, arr)))
>> [0, 4, 8, 12, 16]
4. sorted와 함께 쓰이는 람다
sorted(__iterable, key, reverse) 형식인데, 이 중 key의 역할로 쓰일 수 있다.
만약 문자열을 가진 배열에서 정렬을 진행할 때 두 번째 글씨로 정렬을 하고 싶다면 어떻게 해야할까?
아래의 코드를 확인해보자.
strings = ["apple", "bacon", "sea"] # 첫 번째 글자로 정렬된 배열
print(sorted(strings, key=lambda x:x[1]))
>> ['bacon', 'sea', 'apple']
- 두 번째 글자인 'a', 'e', 'p' 순서대로 정렬된 것을 확인할 수 있을 것이다.
아래와 같이 슬라이싱을 이용해 두 번째 글자 이후로 정렬을 진행할 수도 있다.
print(sorted(strings, key=lambda x:x[1:]))