파이썬의 람다함수는 람다식과 익명함수라고 불리고, 하나의 틀 안에서 쓰고 일시적으로 사용하는 함수이다.
함수의 definition을 쓰는 것이 아니기 때문에, 재 사용성이 없지만 단순히 한번만 사용할 때는 용이하고 메모리를 절약할 수 있기 때문에 경우에 따라서 효율성에 도움이 될 수 있게 사용할 수 있다.
만약에 여러번 사용하는 함수를 정의하지 않고, 매번 람다식을 적어 사용하면 가독성도 그리고 효율성도 떨어지지만
한번만 사용하는 함수라면 람다식을 쓰는것이 가독성과 효율성 모두 얻을 수 있다.
객체지향 코드인 Python에서 모든 것을 객체로 관리하고 사용하는데 Heap 메모리 안에서 모든 객체들의 각자의 레퍼런스 카운터를 갖게되어, 카운터가 참조하지 않고 일정시간이 지나면 메모리를 환원하여 가비지 콜렉터의 역할을 한다.
Java 가비지 콜렉터, 메모리 환원 JVM의 역할은 많이 들어봤는데 람다식을 찾아보며 Python의 메모리에 대한 자세한 내용을 알게되었다.
이제 람다식의 여러가지 표현 방법들을 알아보자.
- 람다 표현식 안에서 변수를 선언할 수 없다.
- 람다식 내에 elif는 사용할 수 없고, if와 else를 반복해서 표현해야 한다.
- 인자와 표현식을 나누는 : 이외에, 표현식에서 : 는 사용하지 않는다.
- map(), filter(), reduce() 함수로 리스트의 각 원소에 람다함수를 적용할 수 있다.
이렇게 생긴 함수를 람다식으로 표현하는 것은 다음과 같다.
lambda 인자(매개변수) : 표현식(함수)
이렇게 표현한 식은
하지만 이렇게는 익명함수인 람다식을 호출할 수 없기 때문에 어딘가에 저장하거나, 변수를 선언하여 호출해야 한다.
변수와 람다식을 동시에 호출하는 방법은 무엇일까?
( lambda 인자 : 표현식 )( 변수 )
람다식의 조건문 if else 와 반복문 for문은 어떻게 사용할까?
lambda 인자 : 식1 if 조건식 else 식2 if 조건식2 else
조건식이 참이면 식1을 실행하고, 아니면 식2를 실행한다.
elif를 람다 표현식에서 사용할 수 없기 때문데 여러 조건을 거치는 표현은 if와 else를 연속적으로 사용하여 표현한다.
조건식과 반복문을 함께 쓴다면 코드의 간결함이 더 나아진다
마지막으로 세가지 함수 map, filter, reduce에 대해서 알아보겠다.
map은 람다식에 리스트를 인자로 받아 있는 모든 변수들에 실행하고, 새로운 리스트로 반환하는 함수이다.
첫번째 식은 a라는 리스트의 사이즈를 map함수 밖에서 구현하고, 인자로 람다식에 적용했다.
두번째 식은 range(10)의 리스트가 만들어지고 map함수 안에서 실행된다.
filter는 람다식에 리스트를 인자로 받아, 람다식을 만족하는 값들로 이루어진 새로운 리스트를 반환하는 함수이다.
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] 중에서 6미만인 값들을 모아 새로운 리스트 [0, 1, 2, 3, 4, 5]로 반환하게 된다.
마지막 reduce는 리스트 뿐만 아니라 튜플, 문자열, 배열과 같은 순서들이 있는 데이터에 적용한다.
자료의 데이터들을 하나씩 누적하며 결과 값을 만든다.
사용하기 위해서는 모듈을 가져와야 한다.
첫번째 식에서 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]를 인자로 받아서 계산하면
[0+1, 0+1+2, 0+1+2+3, ... ,0+1+2+3+4+5+6+7+8+9] = [1, 3, 6, .... , 45]
이렇게 순차적으로 누산한다.
두번째 식에서는 인자를 n,m으로 받는데 람다식은 순서가 바뀌어 있어서 m+n으로 앞뒤가 바뀐다.
결과는 fedcba로 나오고, 밑에 어떻게 시행되는지 적어봤다.
한번에 알파벳 순서가 뒤집히는 것이 아니라 한 문자씩 순서를 변경하게 된다.
몇가지 활용 가능한 람다식들을 적어보고 마무리 하겠다.
첫번째 식은 홀수를 반환하는 필터이다.
2로 나눴을때 0이 나오면 false, 1이 나오면 true이기 때문에, 람다식을 만족하는 true 홀수 값만 리스트로 새로 만들어진다. [1, 3, 5, 7, 9]
두번째 식은 함수 안에 람다식이 포함되어 있고, 그것을 다시 함수로 사용할 수 있는 코드이다.
sec_min(100) 이런식으로 시간의 단위를 변경하는 것에 유용하다.
'Python > Python' 카테고리의 다른 글
Python print {} format (0) | 2021.12.21 |
---|---|
Python 순열, 조합 permutation, combination from Itertools (1) | 2021.09.08 |
Python heapQ 구현 힙 정렬, 힙큐 (0) | 2021.05.06 |
RSA 암호화와 복호화 (0) | 2021.04.12 |