- Published on
9단계: 고급 문법 (람다, 컴프리헨션, 제너레이터)
9-1. 람다 함수
이름 없이 간단하게 함수를 정의할 때 사용합니다.
add = lambda x, y: x + y
print(add(3, 5)) # 8
함수 인자로도 자주 사용됩니다:
data = [3, 1, 4]
print(sorted(data, key=lambda x: -x))
9-2. 리스트 컴프리헨션
squares = [x * x for x in range(5)]
print(squares) # [0, 1, 4, 9, 16]
조건 필터링:
even = [x for x in range(10) if x % 2 == 0]
9-3. 딕셔너리 컴프리헨션
words = ["apple", "banana", "cherry"]
length_map = {w: len(w) for w in words}
9-4. 집합 컴프리헨션
unique_lengths = {len(w) for w in words}
9-5. 제너레이터 함수와 yield
def count_up(n):
i = 0
while i < n:
yield i
i += 1
for val in count_up(3):
print(val)
9-6. 제너레이터 표현식
squares = (x * x for x in range(5))
for s in squares:
print(s)
9-7. 이터레이터 프로토콜
__iter__()
와__next__()
메서드 구현 시 사용자 정의 반복자 생성 가능
class Counter:
def __init__(self, max):
self.max = max
self.cur = 0
def __iter__(self):
return self
def __next__(self):
if self.cur >= self.max:
raise StopIteration
self.cur += 1
return self.cur - 1
요약
- 람다는 한 줄 함수, 간단한 로직 처리에 적합
- 컴프리헨션은 반복/조건을 한 줄로 표현
- 제너레이터는 lazy 반복 구조로 메모리 효율이 높음
- 이터레이터 프로토콜을 구현해 커스텀 반복 객체 생성 가능
심화학습
Q1. 람다 함수는 언제 사용하고, 언제 피해야 할까요?
A1. 짧고 단순한 연산에 적합하지만, 복잡한 로직에는 가독성이 떨어져 일반 함수가 더 낫습니다.
Q2. 리스트 컴프리헨션이 반복문보다 유리한 상황은?
A2. 한 줄로 작성 가능하며, 속도와 가독성이 뛰어난 경우입니다. 단, 너무 복잡해지면 오히려 비권장됩니다.
Q3. 제너레이터의 가장 큰 장점은 무엇인가요?
A3. 메모리를 거의 쓰지 않고 큰 데이터를 순차적으로 처리할 수 있어 대용량 처리에 매우 효율적입니다.