[코딩도장] day22. 파이썬 람다 표현식 - map, filter, reduce
■ 들어가기
- 파이썬 코딩 도장 (남재윤/길벗). 을 공부하며 정리하는 블로그
▶ 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로 만든 함수와 람다 표현식 비교
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 |