python map() 함수는 여러 개의 데이터를 받아서 각각의 요소에 함수를 적용한 결과를 반환하는 내장함수이다. 이때 데이터는 반복가능한 즉, iterable한 객체를 받을 수 있다.
iterable은 반복가능한 모든 객체로, for와 같은 반복문에서 사용이 가능하다.
ex. list, string, dict, tuple, range ...
map(function, iterable)
map() 함수는 iterable의 각 요소에 대해 function 함수를 적용한 결과를 새로운 iterator로 반환한다. 함수를 적용한 각 요소가 새로운 iterator의 각 요소가 된다.
iterator란 iterable의 값을 하나씩 꺼낼 수 있는 도구이다.
이터러블 객체에 iter()함수를 호출하여 반환할 수 있다.
def compute_square(x):
print(f"Computing square of {x}")
return x * x
numbers = [1, 2, 3, 4, 5]
squares = map(compute_square, numbers)
for square in squares:
print(square)
# 출력결과
# Computing square of 1
# 1
# Computing square of 2
# 4
# Computing square of 3
# 9
# Computing square of 4
# 16
# Computing square of 5
# 25
위 예시는 iterator의 특성 중 하나인 지연평가(Lazy Evaluation)를 보여주는 사례이기도 한데(map 함수가 iterator를 반환하므로),
파이썬에서는 제너레이터나 이터레이터를 사용하지 않을 시 코드를 순차적으로 즉각 처리하는 즉시 평가(Eager Evaluation)가 이루어지기 때문이다.
예를 들어, 밑의 코드를 살펴보자.
def compute_square(x):
print(f"Computing square of {x}")
return x * x
numbers = [1, 2, 3, 4, 5]
squares = [compute_square(x) for x in numbers]
for square in squares:
print(square)
# 출력 결과
# Computing square of 1
# Computing square of 2
# Computing square of 3
# Computing square of 4
# Computing square of 5
# 1
# 4
# 9
# 16
# 25
compute_square 함수가 호출될 경우, 문자열이 출력된 후 모든 숫자의 제곱이 즉시 계산되어 리스트 squares에 저장된다. 이렇게 map()과 같은 이러네이터는 필요할때만 값을 계산하여 계산 비용을 효율적으로 처리한다.
여러 이터러블의 길이가 다르면 가장 짧은 이터러블의 길이만큼만 동작하며,
나머지 이터러블의 값은 무시된다.
map 함수 이해를 위해선 itrable과 iterate 개념 이해가 필수적으로 보이는데, 이후 포스팅은 이에 대해 다뤄봐야겠다.