지연 평가(Lazy Evaluation)는 컴퓨터 프로그래밍에서 계산의 결과가 실제로 필요할 때까지 계산을 미루는 전략입니다. 이를 통해 다음과 같은 이점을 얻을 수 있습니다:
Python에서 map() 함수의 예를 들어보겠습니다:
# 이 코드는 map 객체만 생성하고, 아직 실제 변환은 수행하지 않음
numbers = map(float, ["1", "2", "3", "4", "5"])
# 실제로 첫 번째 요소에 접근할 때 변환이 수행됨
first_number = next(numbers) # 이 시점에 "1"이 float(1.0)으로 변환됨
이 코드는 map 객체만 생성하고, 아직 실제 변환은 수행하지 않음
numbers = map(float, ["1", "2", "3", "4", "5"])
# 실제로 첫 번째 요소에 접근할 때 변환이 수행됨
first_number = next(numbers) # 이 시점에 "1"이 float(1.0)으로 변환됨
Python의 다른 지연 평가 예시:
제너레이터(Generators)
이터레이터(Iterators)
range() 함수 (Python 3)
filter() 함수
리스트 컴프리헨션과 대비되는 제너레이터 컴프리헨션
지연 평가의 반대는 즉시 평가(Eager Evaluation)로, 모든 계산이 즉시 수행되는 방식입니다. Python에서 list()로 이터레이터를 감싸면 즉시 평가가 수행되어 모든 요소가 메모리에 로드됩니다.
지연 평가 함수(map(), filter(), 제너레이터 등)의 결과를 리스트로 완전히 사용하려면 반드시 list()로 변환해야 합니다.
지연 평가 함수의 결과를 리스트로 변환하지 않으면:
인덱싱이 불가능합니다 (result[0] 같은 접근 불가)
길이 확인이 불가능합니다 (len(result) 불가)
여러 번 순회할 수 없습니다 (한 번 순회하면 이터레이터가 소진됨)
슬라이싱이 불가능합니다 (result[1:3] 불가)
따라서 지연 평가 결과를 리스트처럼 온전히 사용하려면:
result_list = list(map(float, input().split()))
result_list = list(filter(lambda x: x > 0, numbers))
이렇게 리스트로 변환해야 일반적인 리스트 연산을 모두 사용할 수 있습니다.