질문이 있으십니까?

기본 컨텐츠 및 사용자가 직접 참여하여 만들어진 다양한 내용을 검색합니다.

3.5. 함수.Lambda, map, reduce, filter

Lambda() ?

인공지능 분야나 AutoCAD라는 설계 프로그램에서 쓰이는 Lisp 언어에서 물려받았다고 하는데요, 함수를 딱 한 줄만으로 만들게 해주는 훌륭한 녀석입니다. 사용할 때는 아래와 같이 써주면 되지요.
lambda 인자 : 표현식
# 아래의 코드를 더 간단하게 바꿔보려 해요.
>>> def hap(x, y):
...   return x + y
...
>>> hap(10, 20)
30
>>> (lambda x,y: x + y)(10, 20) #함수가필요없네
30

map() ?

map(함수, 리스트)
>>> list(map(lambda x: x ** 2, range(5)))
[0, 1, 4, 9, 16]
위의 map 함수가 인자로 받은 함수는 lambda x: x ** 2구요, 리스트로는 range(5)를 받았습니다. range 함수는 알고계시죠? range(5) 라고 써주면 [0, 1, 2, 3, 4]라는 리스트를 돌려줍니다. 그리고 x ** 2 라는 것은 x 값을 제곱하라는 연산자죠.
map 함수는 리스트에서 원소를 하나씩 꺼내서 함수를 적용시킨 결과를 새로운 리스트에 담아주니까, 위의 예제는 0을 제곱하고, 1을 제곱하고, 2, 3, 4를 제곱한 것을 새로운 리스트에 넣어주는 것입니다.

reduce() ?

reduce 함수는 다음과 같이 iterable 의 요소들을 function 에 대입하여 결국 하나의 결과값을 리턴해 주는 함수이다.
reduce(함수, 순서형 자료)
>>> from functools import reduce   # 파이썬 3에서는 써주셔야 해요  
>>> def sum(x, y): 
...    return x+y
>>> a = reduce(sum, [1, 2, 3, 4, 5])
>>> print(a)
15
>>> from functools import reduce   # 파이썬 3에서는 써주셔야 해요  
>>> a = reduce(lambda x, y: x + y, [0, 1, 2, 3, 4])
10
위의 예제는 먼저 0과 1을 더하고, 그 결과에 2를 더하고, 거기다가 3을 더하고, 또 4를 더한 값을 돌려줍니다. 한 마디로 전부 다 더하라는 겁니다. 생각보다 쉽죠?
>>> from functools import reduce
>>> a = reduce(lambda x, y: y + x, 'abcde')
>>> print(a)
'edcba'

filter() ?

filter(함수, 리스트)
>>> a = filter(lambda x: x < 5, range(10)) # 5보다 작은것만(조건이 참인것만 반환)
>>> print(list(a))
[0, 1, 2, 3, 4]
리스트에 들어있는 원소들을 함수에 적용시켜서 결과가 참인 값들로 새로운 리스트를 만들어줍니다. 다음은 0부터 9까지의 리스트 중에서 5보다 작은 것만 돌려주는 예제입니다.
>>> a = filter(lambda x: x % 2, range(10)) # 조건식에 맞는것만 반환
>>> print(list[a])
[1, 3, 5, 7, 9]  
참은 1이고 거짓은 0이라고 했죠? 위의 filter 함수를 실행시키면, 0을 2로 나눈 나머지는 0이니까 람다 함수의 결과값은 0이고, 0은 '거짓'이니까 버려집니다. 1을 2로 나눈 나머지는 1이니까 람다 함수의 결과값은 1이고, 1은 '참'이니까 통과하지요.

댓글을 작성하세요

문서 이력

  • 2020-06-07 날짜로 신달수 님으로 부터 컨텐츠명이 변경 되었습니다.
  • 2020-06-09 날짜로 신달수 님께서 등록 작업을 하였습니다.
  • 2020-06-10 날짜로 신달수 님으로 부터 컨텐츠명이 변경 되었습니다.
  • 2020-06-17 날짜로 신달수 님께서 수정 작업을 하였습니다.