프로그래밍Python 개발자

파이썬의 람다 함수에 대해 설명해 주세요. 일반 함수에 비해 어떤 제약이 있나요? 어떤 상황에서 선호되며, 어떤 상황에서 바람직하지 않나요?

Hintsage AI 어시스턴트로 면접 통과

답변

람다 함수lambda 키워드를 사용하여 정의된 익명(이름이 없는) 함수입니다. 일반적으로 "한 번만 사용"하기 위해 짧은 기능이 필요할 때 사용됩니다.

add = lambda x, y: x + y print(add(1, 2)) # 3

람다 함수의 제약:

  • 람다는 단 하나의 표현식만 포함할 수 있으며, 반환 값이 됩니다. 여러 줄 계산, return, if-else와 같은 조건문은 사용할 수 없습니다(삼항 표현식 형태만 가능).
  • 복잡한 코드를 사용할 수 없는 경우 (try/except, 루프 등).
  • 람다는 완전한 문서화가 없습니다(독스트링을 추가할 수 없음).
  • 람다 함수가 중첩될 경우 읽기가 더 어려워집니다.

람다가 유용한 경우:

  • 정렬/필터링의 일관된 키에 사용(키 인자; 예: sorted, filter, map에서).
  • 코드 재사용이 필요하지 않은 경우 — 로컬 작업, 기능을 빠르게 "대체"하는 경우.

람다를 피해야 하는 경우:

  • 복잡한 로직을 사용할 때: 반복 사용을 위해, 코드 또는 조건이 많아 이해도와 가독성을 위해 정식 def 함수로 내보내는 것이 좋습니다.

함정 질문

질문: 람다 함수가 외부 스코프의 변수를 사용할 수 있으며, 이는 반복문 내에서 어떤 영향을 미치나요?

답변: 람다 함수는 외부 컨텍스트의 변수를 캡처할 수 있습니다(렉시컬 클로저). 반복문 내에서 정의하면, 이는 종종 예상치 못한 동작을 유발합니다 — 람다는 호출 시 현재 변수 값을 사용하게 되며, "정의된 시점의 값"이 아닙니다.

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의 대규모 프로젝트: 긴 람다 함수 내에 구현된 복잡한 검증 양식. 이후 비즈니스 로직이 변경되어 람다가 전체 코드를 포함할 수 없게 되었고, 일반 함수로 다시 작성해야 했습니다. 람다는 디버깅을 느리게 만들었습니다.


이야기

한 스타트업에서 정렬 함수를 전달하기 위해 람다를 잘못 사용했습니다. 그것이 잘못된 유형(예: 튜플이 아닌 목록)을 반환한다는 것을 잊고 있었습니다. 이는 예측할 수 없는 정렬 및 데이터 중복 제거와 관련된 버그로 이어졌습니다.