람다(lambda) 함수
파이썬에서는 람다함수를 통해 이름이 없는 함수를 만들 수 있습니다.
람다함수의 장점은 코드의 간결함 메모리의 절약이라고 생각할 수 있습니다.
def키워드를 통해서 함수를 생성하는 방법은 리터럴 표기법에 따른 함수 생성 방법입니다.
함수 또한 클래스를 통해 생성된 객체 인스턴스입니다.
def my_func():
pass
위에 함수를 생성자를 통해 생성하는 방법을 간단하게 표현하면 다음과 같습니다.
my_func = function(code, globals[, name[, argdefs[, closure]]])
코드와 이름을 담아서 함수클래스를 통해서 객체를 생성하고, 그 객체를 함수이름과 동일한 변수에 담는과정을 def키워드가 대신해줍니다.
함수객체를 변수에 담은 시점에서, 함수객체는 메모리에 올라가서 변수를 통해 자신이 호출되기를 기다리게됩니다.
만약 다음과 같이 단한번만 사용될 함수라면 불필요한 메모리가 낭비됩니다.
람다함수는 lambda라는 키워드로 생성할 수 있습니다.
람다함수는 결과부분된 부분을 return키워드 없이 자동으로 return해줍니다.
익명함수라는 이름처럼 lambda함수는 함수의 이름을 지정하지 않습니다.
lambda x : x + 1
위와 같은 람다함수는 인자로 받은 숫자에 +1을 해주는 함수입니다. 람다 함수는 정의와 동시에 사용할 수 있습니다.
(lambda x : x+1)(3)
# 4
하지만 함수에 이름이 없고, 저장된 변수가 없기 때문에 다시 사용할 수는 없습니다.
물론 람다함수도 객체이기 때문에 정의와 동시에 변수에 담을 수는 있습니다.
func = lambda x : x + 1
func(4)
5
람다함수 사용 예
sorted함수의 경우 key위치인자에 함수를 보내서, 함수에서 지장한 결과값에 따라서 정렬을 할 수 있습니다.
다음과 같은 문자를 정렬 할 때,
target = [' cat ', ' tiger ', ' dog', 'snake ']
알파벳 순서가 아니라, 앞뒤 불필요한 공백을 제외한 문자의 길이로 정렬을 하고 싶다면,
정렬의 기준으로 사용할 값을 리턴하는 함수를 생성하여, sorted함수에 넘겨줘야 합니다.
def my_key(string):
return len(string.strip())
target = [' cat ', ' tiger ', ' dog', 'snake ']
print(sorted(target, key=my_key))
하지만 my_key라는 함수는 이번 정렬만을 위한 함수입니다.
재사용할 이유가 없다면 lambda 함수를 생성하여 넘겨주는 편이 낫습니다.
target = ['cat', 'tiger', 'dog', 'snake']
print(sorted(target, key=lambda x : len(x.strip())))