파이썬 공부
들어가며
지난 글에서는 for 반복문과 if 조건문을 한 줄에 압축하여 리스트를 만드는 파이썬의 독특하고 강력한 기능, 리스트 컴프리헨션(List Comprehension)에 대해 배웠습니다. 이를 통해 우리는 코드를 더욱 간결하고 ‘파이썬답게’ 작성하는 방법을 익혔습니다.
우리는 지금까지 def 키워드를 사용해 이름이 있는, 재사용 가능한 함수를 만들어왔습니다. 하지만 프로그래밍을 하다 보면, 어떤 함수는 단 한 곳에서만, 그것도 아주 잠깐 사용될 뿐인데 굳이 def로 거창하게 이름을 붙여 정의하기가 번거로울 때가 있습니다. 예를 들어, sorted() 함수의 key 값으로 정렬 기준을 정해주는 간단한 기능을 만들 때가 바로 그런 경우입니다.
이번 글에서는 이러한 상황을 위해 등장한, 이름 없이 즉석에서 만들어 사용하는 한 줄짜리 미니 함수, 람다(Lambda) 표현식에 대해 알아보겠습니다.
람다(Lambda)란 무엇일까?
람다(Lambda) 표현식은 이름이 없는 익명의 함수(Anonymous Function)를 만드는 방법입니다. def처럼 함수를 정식으로 선언하는 것이 아니라, 하나의 표현식(Expression)으로 함수처럼 동작하는 객체를 생성합니다.
람다의 기본 구조는 매우 간단합니다.
lambda 매개변수: 표현식
lambda: 람다 표현식의 시작을 알리는 키워드입니다.매개변수: 함수가 받을 인자들을 의미합니다. 콤마(,)로 여러 개를 받을 수 있습니다.표현식: 이 매개변수들을 이용해 계산되고, 그 결과가 자동으로 반환(return)되는 단 하나의 표현식입니다.return키워드를 사용하지 않습니다.
두 개의 숫자를 더하는 간단한 함수를 def와 lambda로 각각 만들어 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
# 1. def를 사용한 일반적인 함수 선언
def add_def(x, y):
return x + y
# 2. lambda를 사용한 익명 함수
# add_lambda 변수가 함수 객체를 가리키게 됩니다.
add_lambda = lambda x, y: x + y
# 두 함수의 사용법과 결과는 완전히 동일합니다.
print(f"def 사용: {add_def(10, 20)}")
print(f"lambda 사용: {add_lambda(10, 20)}")
이렇게 람다를 변수에 할당해서 사용할 수도 있지만, 사실 이것은 람다의 주된 사용 목적이 아닙니다. 람다의 진정한 가치는 다른 함수의 인자로 ‘함수’ 자체를 전달해야 할 때 발휘됩니다.
람다는 언제 사용할까?
람다는 다른 함수의 인자로 함수를 넘겨줄 때, 그 넘겨줄 함수가 매우 간단해서 굳이 이름까지 붙여 따로 만들 필요가 없을 때 사용됩니다. sorted(), map(), filter()와 같은 고차 함수(Higher-order function, 함수를 인자로 받거나 반환하는 함수)와 함께 쓰일 때 가장 빛을 발합니다.
sorted() 함수의 key 인자를 예로 들어보겠습니다. 학생의 이름과 점수가 튜플로 묶인 리스트가 있고, 이 리스트를 점수(튜플의 두 번째 요소)를 기준으로 오름차순 정렬하고 싶다고 가정해 봅시다.
1
2
3
4
5
6
7
8
9
10
11
12
students = [('Alice', 90), ('Bob', 85), ('Charlie', 95)]
# 방법 1: 정렬 기준을 위한 함수를 def로 따로 정의
def get_score(student_tuple):
return student_tuple # 튜플의 1번 인덱스(점수)를 반환
sorted_by_def = sorted(students, key=get_score)
print(f"def 사용 정렬: {sorted_by_def}")
# 방법 2: 정렬 기준을 lambda로 즉석에서 정의
sorted_by_lambda = sorted(students, key=lambda student_tuple: student_tuple)
print(f"lambda 사용 정렬: {sorted_by_lambda}")
def를 사용한 방법은 단 한 번의 정렬을 위해 get_score라는 이름의 함수를 따로 만들어야 합니다. 하지만 람다를 사용하면, 정렬 기준이 되는 간단한 함수를 key 인자가 필요한 그 자리에 바로 만들어서 넣어줄 수 있습니다. 코드가 훨씬 간결해지고, 정렬 기준이 무엇인지 한눈에 파악하기 쉬워집니다.
람다의 제약사항
람다는 간결하고 편리하지만, 몇 가지 명확한 제약사항이 있습니다.
하나의 표현식만 가질 수 있습니다.
if-else문이나for문과 같은 복잡한 제어 흐름(문장, Statement)은 람다 안에 포함될 수 없습니다. (단,A if 조건 else B형태의 조건부 표현식은 사용 가능합니다.)return키워드를 사용하지 않습니다. 표현식의 결과가 암묵적으로 바로 반환됩니다.
따라서 함수 내부의 로직이 두 줄 이상이 되거나 복잡해진다면, 람다를 고집하기보다는 명확성을 위해 def를 사용하여 정식 함수를 만드는 것이 바람직합니다. 람다는 ‘간단한’ 기능에만 사용하는 것이 원칙입니다.
마무리하며
이번 글에서는 이름 없이 즉석에서 만드는 한 줄짜리 익명 함수, 람다(Lambda) 표현식에 대해 알아보았습니다. 람다는 그 자체로 쓰이기보다는, sorted()와 같은 다른 함수의 인자로 간단한 기능의 함수를 전달해야 할 때 코드의 간결성과 가독성을 크게 높여주는 강력한 도구라는 것을 확인했습니다.
리스트 컴프리헨션과 람다는 ‘파이썬다운’ 코드를 작성하는 데 있어 핵심적인 역할을 하는 기능들입니다. 이들을 잘 활용하면 복잡한 로직을 간결하게 표현하는 능력을 한 단계 끌어올릴 수 있습니다.
지금까지 우리는 파이썬 언어의 핵심적인 문법과 개념들을 거의 모두 다루었습니다. 이제부터는 파이썬이 기본적으로 제공하는 거대한 ‘도구 상자’, 즉 파이썬 표준 라이브러리(Python Standard Library)를 탐험해 볼 시간입니다. 우리가 직접 모든 것을 만들 필요 없이, 이미 잘 만들어진 모듈들을 가져와 사용하는 방법을 배우게 될 것입니다.
다음 글에서는 이 표준 라이브러리의 개념을 소개하고, 그중에서도 가장 기본적이고 필수적인, 날짜와 시간을 다루는 datetime 모듈과 운영체제(OS)의 기능을 제어하는 os 모듈에 대해 알아보겠습니다.