한양과학기술고등학교

에듀테크 프로젝트 대시보드

람다 · 고차함수

lambda map filter sorted key reduce

람다는 이름 없는 한 줄 함수. sorted·max·filter 등의 key 인자에 주로 씁니다.

1. lambda 문법

square = lambda x: x ** 2
square(5)                    # => 25

add = lambda a, b: a + b
clamp = lambda x, lo, hi: max(lo, min(x, hi))

# lambda 는 단일 표현식만 — 문(statement) 불가
# 여러 줄이 필요하면 def 를 쓰라
lambda 를 변수에 담지 말 것 (PEP8)
  • f = lambda x: ... 대신 def f(x): ... — 디버깅 시 이름이 남음
  • 람다는 인자로 넘길 때만 진가를 발휘

2. sorted / max / min 의 key

words = ["banana", "kiwi", "apple"]
sorted(words, key=len)                  # 길이순
sorted(words, key=str.lower)            # 대소문자 무시

people = [("김", 30), ("이", 25)]
sorted(people, key=lambda p: p[1])      # 나이순
max(people, key=lambda p: p[1])         # => ('김', 30)

# 다중 기준: 튜플 반환 (앞이 우선, 내림차순은 - 붙이거나 reverse)
sorted(people, key=lambda p: (-p[1], p[0]))

3. map / filter

nums = [1, 2, 3, 4]
list(map(str, nums))                    # => ['1', '2', '3', '4']
list(map(lambda x: x * 2, nums))        # => [2, 4, 6, 8]
list(filter(lambda x: x % 2 == 0, nums))  # => [2, 4]

# 대개 컴프리헨션이 더 읽기 쉬움
[str(x) for x in nums]
[x for x in nums if x % 2 == 0]

# map 은 여러 iterable 도 받음
list(map(lambda a, b: a + b, [1, 2], [10, 20]))  # => [11, 22]

4. functools.reduce

from functools import reduce
reduce(lambda acc, x: acc * x, [1, 2, 3, 4])       # => 24
reduce(lambda acc, x: acc + x, [1, 2, 3], 100)     # 초기값 100 => 106

# 대부분 전용 함수가 더 명확
sum(nums)               # reduce(+) 대신
max(nums)
import math; math.prod(nums)   # 곱

5. 자주 쓰는 고차함수

from operator import itemgetter, attrgetter
sorted(people, key=itemgetter(1))       # p[1] — lambda 보다 빠름
sorted(objs, key=attrgetter("age"))     # obj.age

from functools import partial
int2 = partial(int, base=2)
int2("1010")            # => 10

# 조건 만족 개수
sum(1 for x in data if x > 0)
"특별한 경우라도 규칙을 어길 만큼 특별하지는 않다"