2021. 7. 28. 18:25ㆍPython
출처:
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작업에서 사용한다.
'Python' 카테고리의 다른 글
아파치 스파크 Spark 란? (0) | 2021.11.03 |
---|---|
온라인 Python IDE (0) | 2021.10.26 |
scikit-learn 라이브러리 (0) | 2021.08.02 |
List Comprehension (0) | 2021.01.03 |
웹 크롤링 입문- 특정 URL에서 데이터 가져오기 (0) | 2020.07.24 |