ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [코딩도장] day22. 파이썬 람다 표현식 - map, filter, reduce
    IT/파이썬 2020. 9. 13. 16:56

    출처 : unsplash

    ■ 들어가기

    - 파이썬 코딩 도장 (남재윤/길벗). 을 공부하며 정리하는 블로그


    ▶ Unit32. 람다 표현식 사용하기

         - 32.1 람다 표현식으로 함수 만들기

         - 32.2 람다 표현식과 map, filter, reduce 함수 활용하기

     

    >> 32.1 람다 표현식으로 함수 만들기 <<

    - 람다 표현식?? 함수가 아닌 하나의 식으로 표현된 것으로 자바의 람다 표현식과 동일

    - 사용법

    lambda 매개변수:식

    - 람다 표현식(lambda expression)은 이름이 없는 함수(익명 함수)를 만들기 때문에

    1) 변수에 할당하거나

    2) 다른 함수의 인수로 넣을 때 사용

    >>> lambda x : x + 10
    <function <lambda> at 0x01E94198>
    >>> plus_ten = lambda x : x + 10  # 변수 x에 10을 더한 값을 반환
    >>> plus_ten(1)
    11

     

    - def로 만든 함수와 람다 표현식 비교

    출처 : 파이썬 코딩 도장 (dojang.io)

     

    1. 람다 표현식 자체를 호출하기

    - 변수에 할당하지 않고 람다 표현식 자체를 바로 호출 가능

    - 사용법

    (lambda 매개변수 : 식)(인수)

    >>> (lambda x : x + 10)(1)
    11

     

    2. 람다 표현식 안에서는 변수를 만들 수 없다

    - 변수를 만들 수 없으므로 반환값 부분은 변수 없이 식 한 줄로 표현해야 함

    - 변수가 필요하다면 def로 함수를 작성!

    - 단, 람다 표현식 바깥에 있는 변수는 사용 가능함!

    >>> (lambda x : y = 10; x + y)(1)   # 람다 표현식 내부에 변수 사용 불가
    SyntaxError: invalid syntax
    >>> y = 10
    >>> (lambda x : x + y)(1)   # 람다 표현식 내 외부 변수 사용 가능
    11

     

    3. 람다 표현식을 인수로 사용하기

    - map과 람다 표현식의 결합

    - 람다 표현식을 사용하는 이유 중 하나는 함수의 인수 부분에서 간단하게 함수를 만들기 위함 (대표적인 예 : map)

    (잠깐!) map 함수는?

    - map은 리스트의 요소를 지정된 함수로 처리해주는 함수 (참고 : 22.6 리스트에 map 사용하기)

    - list(map(함수, 리스트))

      tuple(map(함수, 튜플))

    - 사례1 : def로 함수를 만들어 map에 사용

    >>> def plus_ten(x) :
    return x + 10

    >>> list(map(plus_ten, [1, 2, 3]))   # 리스트 [1, 2, 3]의 요소를 plus_ten 함수로 처리
    [11, 12, 13]

    - 사례2 : 람다 표현식으로 함수를 만들어 map에 사용

    >>> list(map(lambda x : x + 10, [1, 2, 3]))   # 리스트 [1, 2, 3]의 요소를 람다 표현식으로 처리
    [11, 12, 13]

    >> 32.2 람다 표현식과 map, filter, reduce 함수 활용하기 <<

     

    1. 람다 표현식에 조건부 표현식 사용하기

    - 사용법

    lambda 매개변수 : 식1 if 조건식 else 식2

    - 일반적인 if 조건식에서 :(콜론)을 사용하는 것과 달리 람다 표현식 내부에 : 사용하지 않음

    - 람다 표현식에서 if를 사용하면 반드시 else 사용해야 함 (if만 사용시 SyntaxError 발생)

    >>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    >>> list(map(lambda x : str(x) if x % 3 == 0 else x, a))   # 리스트 a의 요소를 받아 3의 배수인 경우 문자열 처리
    [1, 2, '3', 4, 5, '6', 7, 8, '9', 10]

    - 람다 표현식에서는 elif 사용 불가 (if-else 쌍 연속으로 사용해야 함)

    lambda 매개변수 : 식1 if조건식1 else 식2 if조건식2 else 식3

    - 그렇지만 위의 경우 가독성이 떨어지므로 if-else 연속 표기 필요한 경우 def로 함수 만드는 방법 추천

    >>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    >>> list(map(lambda x : str(x) if x == 1 else float(x) if x == 2 else x + 10, a))
    ['1', 2.0, 13, 14, 15, 16, 17, 18, 19, 20]

     

    2. map에 객체를 여러 개 넣기

    - map은 리스트/튜플 등 반복 가능한 객체를 여러 개 넣을 수 있음

    - 이 경우 매개변수를 리스트/튜플의 개수 만큼 지정하면 됨 (리스트/튜플은 콤마로 구분)

    - 각 리스트/튜플의 동일 인덱스끼리 처리

    >>> a = [1, 2, 3, 4, 5]
    >>> b = [2, 4, 6, 8, 10]
    >>> list(map(lambda x, y : x * y, a, b))
    [2, 8, 18, 32, 50]
    >>> c = [3, 4, 5]
    >>> list(map(lambda x, y : x * y, a, c))   # 두 리스트의 요소 개수가 적은 리스트 기준으로 처리됨
    [3, 8, 15]

     

    3. filter 사용하기

    - 리스트/튜플 등 반복 가능한 객체에서 특정 조건에 맞는 요소만 가져옴

    - 이 때 filter에 지정한 함수의 반환값이 True일 때만 해당 요소를 가져옴

    - 사용법

    filter(함수, 반복 가능한 객체)

    - 사례1 : def로 함수를 만들어 filter 사용

    >>> def f(x) :
    return x > 5 and x < 10

    >>> a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]
    >>> list(filter(f, a))
    [8, 7, 9]

    - 사례2 : 람다 표현식으로 함수를 만들어 filter 사용

    >>> a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]
    >>> list(filter(lambda x : x > 5 and x < 10, a))
    [8, 7, 9]

     

    4. reduce 사용하기

    - 리스트/튜플 등 반복 가능한 객체의 각 요소를 지정된 함수로 처리한 뒤, 이전 결과와 누적해서 반환하는 함수

    - functools 모듈에서 reduce 함수를 가져와야 함)

    - 사용법

    from functions import reduce

    reduce(함수, 반복 가능한 객체)

    - 사례1 : def로 함수를 만들어 reduce 사용

    >>> def f(x, y) :
    return x + y

    >>> a = [1, 2, 3, 4, 5]
    >>> from functools import reduce
    >>> reduce(f, a)
    15

    - 사례2 : 람다 표현식으로 함수를 만들어 reduce 사용

    >>> a = [1, 2, 3, 4, 5]
    >>> from functools import reduce
    >>> reduce(lambda x, y : x + y, a)
    15

     

    댓글

Designed by Tistory.