람다 함수는 lambda 키워드를 사용하여 정의된 익명(이름이 없는) 함수입니다. 일반적으로 "한 번만 사용"하기 위해 짧은 기능이 필요할 때 사용됩니다.
add = lambda x, y: x + y print(add(1, 2)) # 3
람다 함수의 제약:
람다가 유용한 경우:
sorted, filter, map에서).람다를 피해야 하는 경우:
질문: 람다 함수가 외부 스코프의 변수를 사용할 수 있으며, 이는 반복문 내에서 어떤 영향을 미치나요?
답변: 람다 함수는 외부 컨텍스트의 변수를 캡처할 수 있습니다(렉시컬 클로저). 반복문 내에서 정의하면, 이는 종종 예상치 못한 동작을 유발합니다 — 람다는 호출 시 현재 변수 값을 사용하게 되며, "정의된 시점의 값"이 아닙니다.
funcs = [] for i in range(3): funcs.append(lambda: i) # 모든 함수는 2를 반환합니다 (i=2는 반복문 후) print([f() for f in funcs]) # [2, 2, 2]
"오래된" 값을 캡처하려면:
funcs = [] for i in range(3): funcs.append(lambda i=i: i) print([f() for f in funcs]) # [0, 1, 2]
이야기
프로젝트에서 특정 키에 따라 딕셔너리 목록을 필터링하기 위해 람다를 사용했습니다. 반복문 내의 람다는 호출 시점에 다른(예상하지 못한) 값을 가진 변수를 캡처했습니다. 결과적으로 잘못된 필터링과 보고서의 오류가 발생했습니다.
이야기
Django의 대규모 프로젝트: 긴 람다 함수 내에 구현된 복잡한 검증 양식. 이후 비즈니스 로직이 변경되어 람다가 전체 코드를 포함할 수 없게 되었고, 일반 함수로 다시 작성해야 했습니다. 람다는 디버깅을 느리게 만들었습니다.
이야기
한 스타트업에서 정렬 함수를 전달하기 위해 람다를 잘못 사용했습니다. 그것이 잘못된 유형(예: 튜플이 아닌 목록)을 반환한다는 것을 잊고 있었습니다. 이는 예측할 수 없는 정렬 및 데이터 중복 제거와 관련된 버그로 이어졌습니다.