1. lambda
lambda( )는 익명함수라고 하며, 이름이 없는 함수입니다. 간단한 예제로 설명드려 볼게요.
print()
는 이름이 있는 함수입니다. hojun = print hojun('hello world') #출력값 #hello world
print
를 hojun
으로 받고 print함수를 호출할 수 있습니다. 즉, 이름이 있다는 뜻은 함수를 가르키고 있는 '변수명' 이라고 생각하면 돼요.한가지 예제를 더 살펴보도록 할게요.
입력
def add(x, y): return x + y def sub(): pass def div(): pass def mul(): pass caculator = [add, sub, div, mul] print(caculator[0](10, 20))#0번째 값은 add 입니다.
출력
30
우선 add, sub, div, mul이라는 사칙연산을 수행하는 함수를 선언해주었습니다. 그 다음 각 함수들의 이름을 calculator라는 배열에 넣어주었고, print로 0번째 배열을 호출하였더니 함수 add의 결과값인 30이 나오게 되었습니다.
우리가 일반적으로 사용할 수 있는 변수의 위치에 ( )(괄호)만 사용하지 않는다면 변수처럼 사용할 수 있으며, 호출할 때는 '( )'(괄호)를 사용해줍니다.
그럼 lambda함수는 왜 익명함수 일까요? 이름이 있는 함수들과는 다르게 매우 간결하게 작성할 수 있기 때문입니다.
lambda 매개변수 : 결과
이렇게 단 한줄로 함수의 기능을 구현할 수 있어요! 또한 lambda함수는 return이라는 키워드를 입력하지 않아도 결과 부분을 통해 자동으로 return해줍니다.
예제를 볼게요.
입력
제곱 = lambda x : x ** 2 제곱(3)
출력
9
lambda( )함수를 이용하여 x라는 매개변수가 들어오면
x ** 2
를 한 뒤 return하라는 뜻입니다.입력
(lambda x : x ** 2)(3)
출력
9
위 예제처럼 인수도 바로 대입할 수 있습니다.
즉 lambda는 익명 함수라는 이름처럼 함수의 이름을 정하지 않고 lambda라는 키워드를 이용해 함수처럼 이용할 수 있다는 뜻입니다!
2. map( )
lambda 함수와 가장 많이 조합되어 이용하는 함수입니다. 간단히 설명드리도록 할게요.
방금 위에서 만들었던 매개변수를 제곱하여 return하는 함수를 만들어 볼겁니다. 그런데 아까 위에서 작성했던 예제는 하나의 값만 받고 하나의 값만 리턴할 수 있었죠?
여러값이 들어오게 된다면 어떻게 해야할까요?
입력
# 첫번째 방법 def 제곱(x): return x ** 2 list(map(제곱, [1, 2, 3, 4])) # 두번째 방법 list(map(lambda x : x ** 2, [1, 2, 3, 4]))
출력
[1, 4, 9, 16]
첫번째 방법처럼 이름이 있는 '제곱'함수를 새로 정의하여 만드는 방법도 있고, lambda함수를 정의하여 만드는 방법이 있습니다.
두 방법 다 map()함수를 이용하였는데요, map은 리스트의 요소들을 지정된 함수로 처리해주는 함수입니다.
즉, 우리는 [1,2,3,4]라는 리스트 요소들을 '제곱' 혹은 'lambda x:x**2'라는 함수로 처리하도록 하였습니다.
map의 사용방법은 다음과 같습니다.
map(함수, 리스트 혹은 튜플)
3. filter( )
이번에는 lambda와 filter를 사용해보도록 할게요.
입력
list(filter(lambda x : x > 50, range(100)))
출력
[51, 52, 53, . . . ]
filter 함수를 이용하여 50보다 큰 x값을 출력하도록 하였습니다.
4. 실전 문제
아래 문제를 풀어보세요!
'숫자' 배열을 '승수' 배열과 짝지어서 승수만큼 제곱을 시켜줄 것 입니다.
답은 하단에 있으니 꼭 문제를 풀어보시고 확인해주세요:)
입력
숫자 = [1, 2, 3, 4, 5] 승수 = [2, 2, 2, 3, 3] #문제 #1. 숫자의 승수를 zip으로 맵핑해서 진행하세요. #2. 숫자를 승수만큼 승수하여 결과값을 표현해주세요. #3. 승수한 값이 100이상인 값을 출력하세요. #4. 승수한 값을 모두 더하세요.
출력
# 결과값은 다음과 같아야 합니다. # 1. 숫자의 승수를 zip으로 맵핑해서 진행하세요. [(1, 2), (2, 2), (3, 2), (4, 3), (5, 3)] # 2. 숫자를 승수만큼 승수하여 결과값을 표현해주세요. [1, 4, 9, 64, 125] # 3. 승수한 값이 100이상인 값을 출력하세요. [125] # 4. 승수한 값을 모두 더하세요 203
정답
입력
# 1. 숫자의 승수를 zip으로 맵핑해서 진행하세요. list(zip(숫자, 승수)) # 2. 숫자를 승수만큼 승수하여 결과값을 표현해주세요. list(map(lambda x: x[0] : x[1], zip(숫자, 승수))) # 3. 승수한 값이 100이상인 값을 출력하세요. list(filter(lambda x : x > 100, list(map(lambda x : x[0] ** x[1], zip(숫자, 승수))))) # 4. 승수한 값을 모두 더하세요 sum(map(lambda x : x[0] ** x[1], zip(숫자, 승수)))