Python

lambda 함수 사용하는 방법

green_ne 2021. 7. 28. 18:25

출처:

https://realpython.com/python-lambda/#:~:text=The%20lambda%20function%20assigned%20to%20full_name%20takes%20two,normal%20Python%20function%2C%20with%20parentheses%20surrounding%20the%20arguments.

 

How to Use Python Lambda Functions – Real Python

In this step-by-step tutorial, you'll learn about Python lambda functions. You'll see how they compare with regular functions and how you can use them in accordance with best practices.

realpython.com


# lambda 함수 정의하기

간단하게 다음과 같은 함수를 lambda로 바꾸어보자.

아래 두 함수는 같은 의미를 가진 함수다.

def identity(x):
    return x
lambda x: x

lambda 키워드 뒤에 함수의 매개변수, : 뒤에 계산식(body)을 형태로 함수를 정의한다.

 

# lambda 함수의 특징

- 단일 표현식만 실행 가능

- 한 줄로 된 식만 실행가능

- 즉시 호출된 함수 실행(IIFE)(immediately invoked function execution)가능

 

함수 실행은 lambda식을 ()로 감싸주고, 다음과 같이 매개변수를 주면 된다.

(lambda x: x + 1)(2)
# 3

 

lambda 함수는 익명함수이지만, 다음과 같은 방식으로 함수이름을 줄 수 있다.

add_one = lambda x: x + 1
add_one(2)
# 3

 

여러 개의 매개변수를 사용하고 싶다면, 콤마(,)로 연결해주면 된다.

full_name = lambda first, last: f'Full name: {first.title()} {last.title()}'
full_name('guido', 'van rossum')
# 'Full name: Guido Van Rossum'

(lambda x, y, z=3: x + y + z)(1, 2)
# 6
(lambda *args: sum(args))(1,2,3)
# 6
(lambda **kwargs: sum(kwargs.values()))(one=1, two=2, three=3)
# 6

 

익명함수는 함수 이름을 갖지 않는 함수를 말한다. Python에서 익명함수는 lambda 키워드로 생성한다.

따라서 lambda 함수가 익명함수라, 다음과 같이 인터프리터에서 호출할 수 있다.

lambda x, y: x + y

_(1,2)
# 3

 

lambda 함수는 매개변수를 주는 방법이 자유로워서, 다음과 같은 활용이 가능하다.

def outer_func(x):
    y = 4
    return lambda z: x + y + z

for i in range(3):
    closure = outer_func(i)
    print(f"closure({i+5}) = {closure(i+5)}")

# closure(5) = 9
# closure(6) = 11
# closure(7) = 13

실행 순서대로 따라가면,

closure 변수에 outer_func(i) 함수를 할당해준다.

closure 함수를 호출하면서, i+5 를 매개변수로 전달한다.

outer_func() 함수에서는 x=i+5, y=4 로 인식하고, 자유변수 i는 lambda 함수에 매개변수가 된다.

따라서 (i+5)+4+(i) 를 반환한다.

 

# 주의사항

- lambda식으로 될까?싶을 때는 쓰지 말자

- 거추장스럽고 읽기 힘들다

- 어려운 가독성을 갖으며, 불필요하게 영리하다

- PEP 8(Python style guide)를 따르지 않는다

---> 대신 map(), filter(), and functools.reduce() 과 같은 함수가 더 elegant form이다.

 

# 일반적인 lambda 함수 사용방법

(적절한 사용방법)(권장되는 시나리오)

 

보통 하나 이상의 함수를 인수(매개변수)로 사용하거나, 하나 이상의 함수를 반환하는 고차 함수에서 사용한다.

high_ord_func = lambda x, func: x + func(x)
high_ord_func(2, lambda x: x * x)
# 6
high_ord_func(2, lambda x: x + 3)
# 7

 

함수 map(), filter(), functools.reduce() 와 함께 사용한다.

list(map(lambda x: x.upper(), ['cat', 'dog', 'cow']))
# ['CAT', 'DOG', 'COW']

list(filter(lambda x: 'o' in x, ['cat', 'dog', 'cow']))
# ['dog', 'cow']

from functools import reduce
reduce(lambda acc, x: f'{acc} | {x}', ['cat', 'dog', 'cow'])
# 'cat | dog | cow'

 

key 매개변수를 가진 정렬 함수에서 사용한다.

ex. sort(), sorted(), nlargest(), nsmallest() 등

ids = ['id1', 'id2', 'id30', 'id3', 'id22', 'id100']
print(sorted(ids)) # Lexicographic sort
# ['id1', 'id100', 'id2', 'id22', 'id3', 'id30']
sorted_ids = sorted(ids, key=lambda x: int(x[2:])) # Integer sort
# ['id1', 'id2', 'id3', 'id22', 'id30', 'id100']

 

UI Framework에서 UI 이벤트에 대한 mapping작업에서 사용한다.

 

반응형