- lambda는 단일 표현식으로 제한된 익명 함수입니다.
- 가장 좋은 용도는 짧은 인수로 사용하는 것입니다. 특히
sorted,min및max의key입니다. - 목록 이해는 일반적으로 람다를 사용하는
map또는filter보다 더 명확합니다. - 이름에 람다를 할당하는 경우 대신
def을 작성하세요.
가격별로 제품을 정렬해야 합니다. “가격을 사용하세요”라고 말하기 위해 별도의 이름이 지정된 함수를 작성하는 것은 많은 의식처럼 느껴집니다. Python 람다 함수를 사용하면 인라인의 작은 부분을 정확히 사용하는 위치에 정의할 수 있습니다.
람다는 편리하지만 과도하게 사용하기 쉽습니다. 이 가이드에서는 이것이 실제로 도움이 되는 부분과 코드를 읽기 어렵게 만드는 부분을 보여줍니다. 우리는 Python 3.13에서 모든 예제를 실행했으며 표시된 출력은 해당 실행에서 나온 것입니다.
람다란 무엇입니까?
람다는 lambda 키워드로 작성된 이름 없는 함수입니다.
lambda arguments: expression
임의 개수의 인수를 사용하고 단일 표현식의 값을 자동으로 반환합니다. return 키워드도 없고 명령문 본문도 없습니다.
square = lambda x: x * x
print(square(4)) # 16
print((lambda a, b=10: a + b)(5)) # 15
두 번째 줄은 기본 인수로 람다를 정의하고 즉시 호출합니다. 실제 코드에서는 이 내용을 작성하는 경우가 거의 없지만 람다가 일반 함수 개체임을 보여줍니다.
람다 대 데프
이 두 가지 기능은 동일하게 작동합니다.
square = lambda x: x * x
def square_def(x):
return x * x
print(square(4), square_def(4)) # 16 16
print(square.__name__, square_def.__name__) # <lambda> square_def
이름을보세요. 모든 람다는 그냥 <lambda>이라고 불리므로 오류 메시지와 로그에서는 어떤 람다가 실패했는지 알 수 없습니다. 이것이 PEP 8과 같은 스타일 가이드가 함수에 이름을 부여할 때마다 def를 권장하는 주된 이유입니다.
| 특징 | 람다 |
데프 |
|---|---|---|
| 이름 | 익명 | 명명됨 |
| 본체 | 표현 하나 | 진술 개수 제한 없음 |
| 반환 | 암시적 | 명시적 return |
| Docstring 및 유형 힌트 | 지원되지 않음 | 지원됨 |
| 읽을 수 있는 역추적 | 쇼 <lambda> |
이름을 표시합니다 |
| 다음에 가장 적합 | 짧은 일회용 논쟁 | 그 밖의 모든 것 |
키를 이용한 정렬: 최선의 사용법
sorted, min 및 max과 같은 함수는 무엇을 비교할지 결정하는 key 함수를 허용합니다. 람다가 빛나는 곳은 다음과 같습니다.
products = [("pen", 10), ("bag", 900), ("book", 250)]
sorted(products, key=lambda p: p[1])
# [('pen', 10), ('book', 250), ('bag', 900)]
max(products, key=lambda p: p[1])
# ('bag', 900)
여러 항목으로 정렬하려면 튜플을 반환하세요. 여기에서는 사람들을 나이별로 정렬하고, 나이가 많은 사람부터 이름순으로 정렬합니다.
people = [{"name": "Asha", "age": 31}, {"name": "Ben", "age": 25},
{"name": "Dev", "age": 31}]
[p["name"] for p in sorted(people, key=lambda p: (-p["age"], p["name"]))]
# ['Asha', 'Dev', 'Ben']
빼기 기호는 숫자 순서만 반대로 바꿉니다. 기존 함수가 이미 작업을 수행하기 때문에 람다가 전혀 필요하지 않은 경우도 있습니다. 기본 정렬과 대소문자를 구분하지 않는 정렬을 비교해 보세요.
names = ["Asha", "ben", "Chitra", "dev"]
sorted(names) # ['Asha', 'Chitra', 'ben', 'dev']
sorted(names, key=str.lower) # ['Asha', 'ben', 'Chitra', 'dev']
기본값은 대문자로 표시된 모든 단어를 먼저 배치합니다. str.lower을 전달하면 람다 없이 문제가 해결됩니다. operator 모듈은 lambda p: p[1]의 itemgetter(1)과 같은 유사한 도우미를 제공합니다.
맵과 필터
map은 모든 항목에 함수를 적용하고 filter는 true를 반환하는 항목을 유지합니다. 둘 다 람다와 함께 작동하지만 각각을 목록 이해와 비교합니다.
nums = [1, 2, 3, 4, 5, 6]
list(map(lambda n: n * 10, nums)) # [10, 20, 30, 40, 50, 60]
[n * 10 for n in nums] # [10, 20, 30, 40, 50, 60]
list(filter(lambda n: n % 2 == 0, nums)) # [2, 4, 6]
[n for n in nums if n % 2 == 0] # [2, 4, 6]
결과는 동일하며 대부분의 Python 개발자는 이해가 더 쉽다고 생각합니다. map과 filter는 게으른 반복자를 반환하므로 값을 보려면 list()이 필요합니다. Python 목록 이해 가이드에서는 해당 스타일을 자세히 다루고 있습니다. map는 map(str.strip, lines)과 같이 기존 명명된 함수를 사용하여 여전히 잘 읽혀집니다.
감소시키다
functools.reduce 항목을 단일 값으로 결합하여 실행 결과를 전달합니다.
from functools import reduce
reduce(lambda acc, n: acc + n, nums, 0) # 21
sum(nums) # 21
합계와 같은 일반적인 작업의 경우 sum, max 또는 any과 같은 기본 제공 항목을 사용합니다. 드문 경우에는 reduce를 유지하고 람다가 복잡해 보이기 시작하면 일반 루프를 고려하십시오.
람다의 조건
람다에서는 if 문을 사용할 수 없지만 조건식은 사용할 수 있습니다.
label = lambda total: "large" if total >= 1000 else "small"
label(1200), label(300)
# ('large', 'small')
조건 하나는 괜찮습니다. 일단 중첩을 시작하면 독자는 열심히 노력해야 하며 이는 일반적인 if 문을 def 문으로 전환해야 한다는 분명한 신호입니다.
함수를 반환하는 람다
함수는 주변의 값을 기억하는 람다를 만들고 반환할 수 있습니다.
def multiplier(n):
return lambda x: x * n
double = multiplier(2)
double(7) # 14
이는 JavaScript 클로저에 대한 기사에서 다른 언어로 설명하는 클로저 때문에 작동합니다. Python의 functools.partial는 인수를 미리 채우는 또 다른 방법을 제공합니다.
후기 바인딩 트랩
이것은 결국 거의 모든 사람을 붙잡습니다. 우리는 루프에서 세 개의 람다를 생성했으며 각각이 고유한 숫자를 반환할 것으로 예상했습니다.
funcs = [lambda: i for i in range(3)]
[f() for f in funcs]
# [2, 2, 2]
세 가지 모두 2를 반환합니다. 람다는 생성될 때 i의 값을 캡처하지 않습니다. 변수가 호출될 때 변수를 조회하고 루프가 완료되어 i가 2로 남습니다. 기본값은 정의 시 평가되므로 일반적인 수정 방법은 값을 기본 인수로 캡처하는 것입니다.
funcs = [lambda i=i: i for i in range(3)]
[f() for f in funcs]
# [0, 1, 2]
루프 내부의 def이 동일한 방식으로 동작하므로 이는 람다에만 고유한 것이 아닙니다. 버튼 콜백을 연결할 때와 같이 루프에서 일반적으로 생성되기 때문에 람다에서 더 자주 나타납니다.
팁: 항목별로 기능이 필요한 경우 많은 기능이 필요한지 고려하십시오. 항목을 인수로 취하는 단일 함수가 더 명확하고 트랩을 완전히 피하는 경우가 많습니다.
작은 함수의 조회 테이블
람다는 이름을 작은 작업에 매핑하는 사전에 깔끔하게 맞습니다.
ops = {
"add": lambda a, b: a + b,
"sub": lambda a, b: a - b,
}
ops["sub"](10, 3) # 7
이는 if과 elif의 긴 체인을 대체할 수 있습니다. Python 사전 가이드는 더 많은 사전 패턴을 다루고 있으며 operator 모듈은 이미 operator.add와 operator.sub을 제공합니다.
람다의 한계
- 단 하나의 표현식만.
=에 할당이 없고, 루프도 없고,try블록도 없습니다. - 문이 없습니다. 테스트에서 확인된 것처럼
SyntaxError과 함께lambda x: return x쓰기가 실패합니다. - 독스트링이나 유형 힌트가 없습니다. 도구와 독자는 도움을 덜 받습니다.
- 디버깅이 더 어렵습니다. 오류는 유용한 이름보다는
<lambda>를 가리킵니다.
물론 람다는 여전히 예외를 발생시킬 수 있습니다. 이러한 작업을 처리하는 작업은 Python 예외 처리에서 다루는 대로 모든 기능과 동일합니다.
람다를 사용하지 말아야 할 경우
| 상황 | 더 나은 선택 |
|---|---|
| 이름에 할당하기 | 데프 |
| 논리에는 두 개 이상의 라인이 필요합니다. | 데프 |
| 목록 변환 또는 필터링 | 목록 이해 |
| 합산 또는 최대값 찾기 | sum, max, min |
| 항목 또는 속성 가져오기 | operator.itemgetter 또는 attrgetter |
| 동일한 람다가 여러 위치에 나타납니다. | 테스트할 수 있는 명명된 함수 |
마지막 점이 중요합니다. 재사용할 가치가 있는 논리는 테스트할 가치가 있으며, pytest 튜토리얼에서 볼 수 있듯이 명명된 함수는 테스트하기가 훨씬 쉽습니다.
마무리
좋은 람다는 한 눈에 읽을 수 있을 만큼 짧고 일반적으로 인수로 한 번 사용됩니다. 정렬 키가 전형적인 예입니다. 자신의 코드를 확인하려면 = lambda을 검색하여 이름이 지정된 함수로 변환하세요. 그런 다음 람다가 포함된 map 또는 filter을 보고 이해력이 더 좋은지 확인하세요.
자주 묻는 질문
Python의 람다 함수란 무엇입니까?
이는 람다 키워드로 생성된 작은 익명 함수입니다. 인수를 취하고 이름이나 return 문 없이 단일 표현식의 값을 반환합니다.
Python 람다는 여러 줄을 가질 수 있습니까?
아니요. 람다는 하나의 표현식으로 제한됩니다. 대괄호 안의 줄로 분할할 수 있지만 여전히 명령문을 포함할 수 없으므로 더 복잡한 논리에는 def를 사용하세요.
람다에서 else if를 사용할 수 있나요?
람다 x: “big” if x > 10 else “small”과 같은 조건식을 사용할 수 있습니다. 블록이 포함된 if 문은 허용되지 않습니다.
람다는 일반 함수보다 빠르나요?
의미가 없습니다. 둘 다 동일한 종류의 함수 개체를 만듭니다. 성능이 아닌 가독성을 위해 둘 중 하나를 선택하세요.
람다 또는 목록 이해와 함께 지도를 사용해야 합니까?
대부분의 Python 개발자는 가독성을 위해 목록 이해를 선호합니다. map은 map(str.strip, Lines)과 같은 이름이 지정된 함수가 이미 있는 경우에 적합합니다.
계속 학습하세요
테스트, WordPress 또는 SEO에 도움이 필요하십니까?
우리는 팀이 더 나은 소프트웨어를 출시하고 사이트를 성장시킬 수 있도록 돕습니다. 현재 진행 중인 작업을 알려주시면 명확한 다음 단계를 제안해 드리겠습니다.
추가 가이드 테스트, AI 및 최신 개발
이 기사가 마음에 드셨나요? 주제를 선택하고 최신 튜토리얼로 바로 이동하세요.
AI 환각 설명: 언어 모델이 사물을 구성하는 이유와 이를 줄이는 방법
AI 환각은 그것이 무엇인지, 언어 모델이 환각을 생성하는 이유, 일반적인 유형, 접지 및 프롬프트를 통해 환각을 줄이는 방법, 그리고 우리가 실행한 간단한 점검에 대해 설명했습니다.
기사 읽기 →DevOps환경 변수 설명: .env 파일, 비밀 및 구성이 올바르게 완료되었습니다.
우리가 실행한 Python 예제를 통해 설명된 환경 변수: 읽기 및 설정, 모든 값이 문자열인 이유, .env 파일, 프로세스 상속, 비밀 및 유효성 검사.
기사 읽기 →소프트웨어 개발API 속도 제한 설명: 알고리즘, 헤더 및 429 오류 처리
우리가 실행한 시뮬레이션을 통해 설명된 API 속도 제한: 토큰 버킷, 고정 창, 슬라이딩 창, 429 응답, 속도 제한 헤더, 백오프를 사용한 재시도 및 테스트 제한.
기사 읽기 →테스트 자동화Python에서 조롱: unittest.mock, 패치 및 테스트를 거짓말로 만드는 실수
Unittest.mock을 사용하여 Python에서 모의, 테스트됨: 모의 및 return_value, 부작용, 이름이 사용되는 패치, 사양 및 자동 사양, 모의 날짜 및 일반적인 실수.
기사 읽기 →소프트웨어 테스트코드 커버리지 설명: 회선 커버리지와 분기 커버리지 및 100%의 실제 의미
실제 Coverage.py 실행을 통해 설명되는 코드 적용 범위: 라인, 분기 및 조건 적용 범위, 보고서 읽기, 100% 적용 범위가 여전히 버그를 놓칠 수 있는 이유 및 합리적인 대상.
기사 읽기 →데이터베이스 및 SQLSQL의 DELETE vs TRUNCATE vs DROP: 차이점, 롤백 및 사용 시기
테스트된 SQL을 통해 DELETE 대 TRUNCATE 대 DROP에 대해 설명합니다. 각각의 제거, 롤백, 트리거, ID 재설정, 속도 및 PostgreSQL, MySQL, SQL Server 및 SQLite의 차이점.
기사 읽기 →데이터베이스 및 SQLSQL 뷰 설명: 예제를 통해 함정 생성, 사용 및 방지
우리가 실행한 쿼리로 설명된 SQL 뷰: 뷰 생성, 실시간 결과, 열 숨기기, 성능, 업데이트 가능하고 구체화된 뷰, 손상된 종속성 및 모범 사례.
기사 읽기 →소프트웨어 개발TypeScript 인터페이스와 유형: 실제 차이점, 컴파일러로 테스트
TypeScript 인터페이스 대 유형, 실제 컴파일러로 확인: 둘 다 할 수 있는 것, 하나만 할 수 있는 것, 선언 병합, 확장 대 교차점 및 따라야 할 간단한 규칙.
기사 읽기 →소프트웨어 개발Python *args 및 **kwargs 설명: 명확한 예가 포함된 유연한 함수
Python *args 및 **kwargs는 우리가 실행한 코드(패킹 및 언패킹, 매개변수 순서, 키워드 전용 및 위치 전용 인수, 데코레이터 및 일반적인 오류)를 설명했습니다.
기사 읽기 →소프트웨어 개발Python Lambda 함수: 구문, 실제 사용 및 사용하지 말아야 할 경우
Python 람다 함수는 구문, 키를 사용한 정렬, 맵 및 필터, 클로저, 후기 바인딩 트랩, 일반 def가 더 나은 선택인 경우 등 우리가 실행한 코드로 설명되었습니다.
기사 읽기 →인공지능AI 에이전트란 무엇입니까? 작동 방식, 간단한 에이전트 루프를 사용하여 실행할 수 있음
AI 에이전트란 무엇입니까? 우리가 실행한 작은 Python 루프, 실제 위험 및 간단한 챗봇이 더 나은 선택일 때 에이전트 루프, 도구, 메모리 및 가드레일에 대한 일반 가이드입니다.
기사 읽기 →DevOps모니터링과 관찰 가능성: 로그, 지표, 추적을 통한 실제 차이점
모니터링과 관찰 가능성 설명: 알려진 오류와 알려지지 않은 오류, 로그, 지표 및 추적, 결제 사건 안내, 골든 신호, OpenTelemetry 및 유용한 경고.
기사 읽기 →DevOpsDocker 볼륨과 바인딩 마운트: 컨테이너 데이터를 올바른 방식으로 유지
Docker 볼륨과 바인드 마운트 설명: 컨테이너 데이터가 사라지는 이유, 명명된 볼륨, 바인드 마운트, tmpfs, Compose 예제, 백업, 권한 및 각 사용 시기.
기사 읽기 →테스트 자동화TDD와 BDD: 주요 차이점, 두 가지 방식으로 구축된 하나의 기능 및 각 사용 시기
TDD와 BDD는 두 가지 방식으로 구축된 하나의 할인 기능, 즉 우리가 실행한 코드를 사용한 적록 리팩토링, 주어진 시점 시나리오, 도구, 장단점 및 각 사용 시기를 설명합니다.
기사 읽기 →소프트웨어 개발Git merge vs rebase: 차이점, 예제, 언제 무엇을 쓸까
Git merge vs rebase를 실제 로그 출력, 비교표, rebase의 황금률, 안전한 팀 워크플로로 설명합니다.
기사 읽기 →소프트웨어 개발파이썬 리스트 컴프리헨션: 문법, 예제, 피해야 할 때
파이썬 리스트 컴프리헨션 설명: 문법, 필터링, if-else, 중첩 반복문, 실제 측정 시간, 그리고 일반 for 반복문이 더 나은 경우.
기사 읽기 →데이터베이스 및 SQL예제로 쉽게 배우는 SQL JOIN (Inner, Left, Right, Full)
샘플 테이블과 쿼리로 SQL JOIN을 단계별로 이해하세요. INNER, LEFT, RIGHT, FULL, CROSS, SELF와 흔한 실수, 성능 팁까지 정리했습니다.
기사 읽기 →