순서가 있는 시퀀스형 데이터 즉, 배열을 다룰 때 유용하게 쓸 수 있는 함수를 배워보자.
배열은 어느 분야이든 쓰이는 데이터 형태이므로 익혀두면 도움이 될 것이다!
- TMI ) Reduce와 Map은 스터디를 하면서 한번 정리한 적이 있어서, 어느정도 알고 있는데 Lambda와 Filter는 아직 어색한 것 같다. 빨리 익숙해져야겠다.
익명 함수로, 힙 영역에서 사용 즉시 소멸되는 함수다.
장점
- 일회용성 함수로 메모리를 아끼는 것이 가능하다.
- pythonic하게 코드를 짤 수 있다.
- 파이썬 가비지 컬렉터 에 count가 0으로 취급된다.
GC는 불필요한 변수나 참조를 알아서 정리해서 메모리를 관리해주는 과정이다.일반 함수와 비교
- 일반 함수 : 재사용성을 위해 메모리에 저장한다.
- 람다 함수 : 내부적으로 call을 할때마다 제너레이터 객체(iterate)를 리턴하기 때문에 메모리의 낭비가 적다.
#세 수의 합을 더하는 함수를 만들 때
#한번 사용할거라면 익명함수 lambda 만들어주기
cul = lambda a,b,c : a+b+c
print('ex 1 >',cul(1, 2, 3))
리스트 모든 요소들을 연산 처리한 뒤 그 결과를 반환하고 싶을 때 사용한다.
map(함수, 시퀀스)
digits1 = [ x * 10 for x in range(1,11)]
# 리스트에 1~10를 넣어준다.
# (함수, 시퀀스)
result = map(lambda i: i**2, digits1)
# map object로 출력이 된다.
print('ex 2 >',result)
# list로 형변환을 해줘야 출력이 된다.
print('ex 2 >',list(result))
# 람다 이용하기
def ex2_func(x):
return x**2
result_without_lambda = map(ex2_func, digits1)
print('ex 2 >', list(result_without_lambda))
def also_square(nums):
def double(x):
return x**2
return map(double,nums)
# 기능별로 모듈화를 해서 은닉화 가능
print('ex 2 >',list(also_square(digits1)))
특정 조건에 해당하는 값만 따로 모아서 시퀀스형으로 리턴해준다.
filter(함수, 시퀀스)
digits = [1,2,3,4,5,6,7,8,9,10]
results = filter(lambda i : i % 2 ==0, digits)
print('ex 3 >',list(results))
def also_evens(nums):
def is_even(x):
return x % 2 == 0
return filter(is_even,nums)
print('ex 3 >',list(also_evens(digits)))
여러개의 순회가능한 시퀀스형 데이터에서 누적되게 데이터를 계산해야 할 때 사용하면 좋다.
from functools import reduce
from functools import reduce
digits3 = [ x for x in range(1,101)]
# 가장 마지막 결과값만 반환한다.
result3 = reduce(lambda x,y : x + y, digits3)
print('ex 4 >',result3)
# 출력 : ex 4 > 5050
def also_add(digits3):
def add_plus(x,y):
return x + y
return reduce(add_plus,digits3)
print('ex 4 >',also_add(digits3))
# 출력 : ex 4 > 5050
[출처] 인프런 - 모두를 위한 파이썬 : 필수 문법 배우기 Feat. 오픈소스 패키지 배포 (Inflearn Original)