파이썬에서는 람다함수를 통해 이름이 없는 일회용 함수를 만들 수 있다.
함수를 이름을 정의해 선언하면 해당 함수를 재사용 가능하다는 이점이 있지만, 역으로 함수 객체에 메모리가 할당되기 때문에 일회용 함수에 대해서는 굳이 불필요한 메모리를 낭비할 필요가 없을 것이다.
람다함수를 이용하면 코드를 간결하게 작성 가능하며, 메모리도 절약할 수 있다는 이점이 있다.
그러나, 나는 유독 람다함수 문법이 어려워 그 사용법을 정리해보았다.
- 람다함수 기본 문법
람다함수를 생성할 때는 일반 함수를 생성할 때와 달리 def 키워드나 return 키워드가 불필요하다.
lamda라는 키워드만으로 함수를 생성할 수 있다.
lambda 매개변수 : 결과
입력받은 인자에 대해 1을 더해 반환해주는 람다함수
lambda x : x + 1
만약 바로 사용하려면, 일반적으로 함수 사용할 때처럼 괄호에 인자를 넣어주면 된다.
(lambda x : x + 1)(1)
>>> 2
인자가 여러 개인 람다함수
(lambda x, y: x + y)(2, 3)
>>> 5
- 람다함수로 정렬하기
리스트, 튜플 등을 정렬할 때 쓰는 sort(), sorted()의 key 값에 람다함수를 넣어주면 된다
리스트 각 요소의 첫 번째 n번 인덱스를 기준으로 정렬하기
test = [(0, 3), (1, 1), (2, 0)]
n = 1
test_sorted = sorted(test, key = lambda x : x[n])
>>> test_sorted = [(2, 0), (1, 1), (0, 3)]
sorted() 대신 sort()를 쓴다면,
test.sort(key = lambda x : x[n])
>>> test = [(2, 0), (1, 1), (0, 3)]
만약 정렬에 다중 조건을 걸고 싶으면 람다함수의 결과부분에 해당 조건들의 키값을 (key1, key2, ...) 형태로 입력해주면 된다.
만약 조건 앞에 -를 붙이면 reverse=True, 즉 내림차순으로 정렬된다.
0번 인덱스를 기준으로 정렬 후, 0번 인덱스가 같을 경우 길이가 긴 요소를 먼저 정렬하기
test = ['aaa', 'ccc', 'bbbb', 'aaaaa']
test.sort(key = lambda x : (x[0], -len(x)))
>>> test = ['aaaaa', 'aaa', 'bbbb', 'ccc']
- 람다함수에서의 조건문
lambda x : 참일 때 반환값 if 조건 else 거짓일 때 반환값 와 같은 형식을 지켜주면 된다.
조건문에서 콜론(:)이 없는 점과 무조건 else문을 적어줘야 한다는 점이 기존 파이썬 조건문과의 차이점이다.
(lambda x : 'True' if x > 0 else 'False')(2)
>>> 'True'
또한, elif를 쓸 수 없으므로 조건문을 여러 개 사용하고 싶다면
lambda x : 결과1 if 조건1 else 결과2 if 조건2 else 결과3 와 같이 작성하면 된다.
(lambda x : 'True' if x > 0 else 'Zero' if x==0 else 'False')(0)
>>> 'Zero'
- map
리스트, 튜플 등 iterable 객체에 map()을 사용하면 객체의 각 요소에 함수가 적용된다.
map()을 사용할 때는 두 번째 인자로 2이상의 요소를 가진 객체를 지정해줘야 한다.
또한, map()자체는 프로세스 이므로 반환받을 값의 형식을 별도로 지정해줘야 원하는 결과를 받을 수 있다.
예를 들어, 리스트 각 요소에 1씩을 더하고 싶다면
test = [1, 2, 3]
list(map(lambda x : x + 1, test))
>>> [2, 3, 4]
map()은 특히 앞서 언급한 조건문과 같이 쓰일 때 강력하다
예를 들어, 리스트 요소의 홀짝을 판별하고 싶다면
test = [2, 4, 3, 1, 0]
list(map(lambda x : 'even' if x%2 == 0 else 'odd', test))
>>> ['even', 'even', 'odd', 'odd', 'even']
map()에는 iterable 객체를 여러 개 넣을 수 있다.
예를 들어 두 리스트의 요소를 더해 새로운 리스트를 만들고 싶으면 다음과 같이 매개변수를 2개 지정해주고, 각각의 리스트를 콤마(,)로 구분해서 넣어주면 된다.
test1 = [1, 2, 3]
test2 = [1, 1, 2]
list(map(lambda x, y : x + y, test1, test2))
>>> [2, 3, 5]
- filter
filter()를 쓰면 조건식의 값이 True인 요소만 반환한다
filter() 역시 map()과 마찬가지로 첫 번째 인자로 함수, 두 번째 인자로 iterable 객체를 적어주면 된다.
또한, 반환받을 형식을 지정해줘야 된다.
리스트에서 자연수만 반환받고 싶다면
test = [1, 2.3, 0, -3, 11]
list(filter(lambda x : x == int(x) and x > 0, test))
>>> [1, 11]
- reduce
값을 누적시킬 때는 reduce()를 사용한다.
reduce는 functools 모듈을 불러와야 사용 가능하므로 일단 import부터 해준다.
from functools import reduce
리스트 요소의 누적 값을 reduce()를 통해 구해보면,
result = reduce(lambda x, y : x + y, [1, 2, 3, 4])
>>> result = 10
'Python' 카테고리의 다른 글
vscode black 자동 포매팅 설정 (0) | 2024.02.22 |
---|---|
python으로 파일(폴더) 이동, 복사, 삭제 등 (0) | 2024.01.05 |
파이썬 itertools 모듈 (1) | 2022.10.18 |
문자열의 구성(숫자, 알파벳) 판별 (0) | 2022.10.12 |
댓글