-
[코딩도장] day22. 파이썬 람다 표현식 - map, filter, reduceIT/파이썬 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)
112. 람다 표현식 안에서는 변수를 만들 수 없다
- 변수를 만들 수 없으므로 반환값 부분은 변수 없이 식 한 줄로 표현해야 함
- 변수가 필요하다면 def로 함수를 작성!
- 단, 람다 표현식 바깥에 있는 변수는 사용 가능함!
>>> (lambda x : y = 10; x + y)(1) # 람다 표현식 내부에 변수 사용 불가
SyntaxError: invalid syntax
>>> y = 10
>>> (lambda x : x + y)(1) # 람다 표현식 내 외부 변수 사용 가능
113. 람다 표현식을 인수로 사용하기
- 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'IT > 파이썬' 카테고리의 다른 글
[코딩도장] day23. 클래스 사용하기 (0) 2020.09.16 [코딩도장] day23. 클로저 사용하기 (0) 2020.09.16 [코딩도장] day22. 재귀호출 (0) 2020.09.13 [코딩도장] day21. 함수에서 위치 인수와 키워드 인수 사용하기 (0) 2020.09.12 [코딩도장] day21. 파이썬 함수 사용하기 (0) 2020.09.12