상세 컨텐츠

본문 제목

lambda, map, filter, reduce 함수

개발/python-심화(Advanced)

by Matthew0633 2022. 5. 17. 23:32

본문

파이썬을 다루며, 시퀀스형 전처리에 Reduce, Map, Filter 자주 사용하게 되었는데 해당 함수들이 단순 반복문을 사용하는 것보다 속도도 미세하게 빠르다고 알려져 있기 때문이다. 따라서 익명함수인 lambda 까지 해서 네가지 함수에 대해 정리하려고 한다

lambda 함수

lambda : 익명함수를 정의한다. 재사용을 위해 메모리에 저장되도록 변수에 할당하는 일반함수와 달리, lambda 함수를 사용했을 때 힙 영역 사용 즉시 소멸하여, 재사용되지 않는 함수를 pythonic 하게 정의할 수 있는 동시에 메모리에 남게하지 않을 수 있다. 즉시 소멸하다는 것은, lambda 함수의 reference count가 0으로 유지될 수 있다는 것이다.

# Ex1
cul = lambda a, b, c: a * b + c

print(cul(10, 15, 20)) # 170

map 함수

map : 인자로 들어온 iterable 객체의 원소들에 대해, 인자로 설정한 함수 결과값들로 변환한다

아래는 map함수와 lambda 함수, map함수와 일반함수 를 사용한 예이다.

# Ex2
digits1 = [x * 10 for x in range(1, 11)]
print(digits1) # [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

def ex2_func(x):
    return x **2

# map + 일반함수
result = list(map(ex2_func , digits))

# map + lambda
result = list(map(lambda i: i ** 2 , digits1))

print(result) # [100, 400, 900, 1600, 2500, 3600, 4900, 6400, 8100, 10000]

map 을 사용한 결과값을 반환하도록 함수로 정의하여 사용할 수도 있다

# map + 일반함수 -> 함수 내에서 사용
def also_square(nums):
    def double(x):
        return x ** 2
    return map(double, nums)

print(list(also_square(digits1))) # [100, 400, 900, 1600, 2500, 3600, 4900, 6400, 8100, 10000]

filter 함수

filter : 인자인 iterable 객체의 원소들 중, 인자인 함수 결과값을 True로 반환하는 원소들만 남긴다

map과 마찬가지로, filter함수와 lambda 함수, filter 함수와 일반함수 를 사용할 수 있으며, filter 을 사용한 결과값을 반환하도록 함수로 정의하여 사용할 수도 있다.

# Ex3
digits2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# filter + lambda
result = list(filter(lambda x: x % 2 == 0, digits2))
print(result) # [2, 4, 6, 8, 10]

# filter + 일반함수 -> 함수 내에서 사용
def also_evens(nums):
    def is_even(x):
        return x % 2 == 0
    return filter(is_even, nums)

print(list(also_evens(digits2))) # [2, 4, 6, 8, 10]

reduce 함수

reduce : 앞에서부터 순차적으로 인자의 함수와 같이 두 개의 원소에 대해 연산을 거듭해나간다. 이 때 사용하는 함수는 인자를 두 개 가진다 (두 수의 연산이기 때문)

functools 라이브러리에서 import하여 사용해야 한다. map, filter 와 마찬가지로, lambda 함수와 일반함수 모두 활용하여 사용할 수 있다

# Ex4
from functools import reduce

digits3 = [x for x in range(1, 101)]

# reduce + lambda
result = reduce(lambda x, y: x+y, digits3)
print(result) # 5050

# reduce + 일반함수 -> 함수 내에서 사용
def also_add(nums):
    def add_plus(x, y):
        return x + y
    return reduce(add_plus, nums)

print(also_add(digits3)) # 5050

 

관련글 더보기

댓글 영역