2-2. 필수 문법 ( 배열 관련 함수 )

uoayop·2021년 3월 14일
0

Leaf와 Python

목록 보기
6/21
post-thumbnail

순서가 있는 시퀀스형 데이터 즉, 배열을 다룰 때 유용하게 쓸 수 있는 함수를 배워보자.
배열은 어느 분야이든 쓰이는 데이터 형태이므로 익혀두면 도움이 될 것이다!

  • TMI ) Reduce와 Map은 스터디를 하면서 한번 정리한 적이 있어서, 어느정도 알고 있는데 Lambda와 Filter는 아직 어색한 것 같다. 빨리 익숙해져야겠다.

Sequence type function

  • 오늘의 키워드
    • lambda, reduce, map, filter

lambda

익명 함수로, 힙 영역에서 사용 즉시 소멸되는 함수다.

장점

  • 일회용성 함수로 메모리를 아끼는 것이 가능하다.
  • pythonic하게 코드를 짤 수 있다.
  • 파이썬 가비지 컬렉터 에 count가 0으로 취급된다.
    GC는 불필요한 변수나 참조를 알아서 정리해서 메모리를 관리해주는 과정이다.

일반 함수와 비교

  • 일반 함수 : 재사용성을 위해 메모리에 저장한다.
  • 람다 함수 : 내부적으로 call을 할때마다 제너레이터 객체(iterate)를 리턴하기 때문에 메모리의 낭비가 적다.
#세 수의 합을 더하는 함수를 만들 때 
#한번 사용할거라면 익명함수 lambda 만들어주기


cul = lambda a,b,c : a+b+c
print('ex 1 >',cul(1, 2, 3))

map

리스트 모든 요소들을 연산 처리한 뒤 그 결과를 반환하고 싶을 때 사용한다.

  • 각각 함수의 매개변수로 적용해준 뒤, 그 결과를 이터레이트 한 객체 형태로 받아온다.
  • next를 통해 객체의 다음 요소를 때올 수 있다.
  • map 함수는 인자를 두개 받는다. map(함수, 시퀀스)
  • 결과가 제너레이터가 반환되므로 list()로 묶어서 형변환을 해줘야한다.
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)))
  • map의 함수 인자는 당연히 람다함수로 대체할 수 있다.
    ⭐️ 람다를 이용하면 가비지 컬렉터에서 필터가 된다.

filter

특정 조건에 해당하는 값만 따로 모아서 시퀀스형으로 리턴해준다.

  • map과 동일한 인자를 받는다. 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)))

reduce

여러개의 순회가능한 시퀀스형 데이터에서 누적되게 데이터를 계산해야 할 때 사용하면 좋다.

  • 모듈을 import 해야만 사용 가능하다.
    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)

profile
slow and steady wins the race 🐢

0개의 댓글