def Sum(a,b):
return a+b
lam = lambda a,b: a + b
print(Sum(50,50))
print(lam(50,50))
오늘 글의 시작은 퀴즈입니다.
위 코드의 결과값은 무엇일까요?
def Sum(a,b):
return a+b
lam = lambda a,b: a + b
print(Sum(50,50))
print(lam(50,50))
>>> 100
>>> 100
답을 알려드리자면 똑같게 100이 출력됩니다. def 경우 저번 시간에 배운 함수를 선언하는 키워드 였죠. a,b를 매개변수 값으로 받아서 a+b를 반환(return) 하는 간단한 합의 함수입니다. 그런데 lambda 라는 새로운 키워드가 보입니다. 아직은 잘 모르지만 a,b : a + b 라는 문장을 보고 유추하건데 a, b를 받아서 a+b를 출력으로 던지는 식 같이 보이는군요.
이것이 바로 이번 시간에 배울 람다식입니다.
람다를 사용하는 이유중 하나는 한 문장의 코드를 간결한 한 줄의 식으로 바꿔낼 수 있기 때문입니다. 실제로 Sum() 함수나 lam 이라는 람다식이나 동일한 기능을 수행합니다.
lambda 인자 : 식
람다식의 표현 방식입니다. lambda a,b: a + b 의 경우엔 인자로 a,b 를 받고 식에선 a+b를 처리 하게 됩니다.\다른 프로그래밍 언어에서는 람다식을 사용할때 보통 => 를 기호를 사용해 나타내지만 파이썬에선 람다식 표현에 : 를 사용합니다.
파이썬 자체에서 if문이나 while문을 사용할때도 중괄호 대신 콜론(:)과 들여쓰기 사용을 하는게 문법상의 강제 조건이였기 때문에 여기서도 콜론을 사용한다고 보시면 되겠습니다.
람다식은 함수를 간단하게 사용해줄 수 있는 것으로, 이름이 없는 함수라고 해서 익명함수라고도 불립니다.
개인적으로 파이썬으로 프로그램을 만들면서 함수 선언 대신에 람다식으로 만들었던 기억은 많이 없습니다. 그러나 파이썬 함수 중에는 함수인데 함수를 인자로 받는 것이 있습니다.
이때 인자값으로 함수를 def로 선언해서 넣어주는게 아닌 이름이 없는 함수인 람다식을 넣어서 간단하게 사용을 할 수 있습니다. (이게 람다식의 대부분 사용 예시라고 보시면 됩니다.) 말로 설명하면 어려우니 예제를 한번 보면서 익혀보겠습니다.
filter(조건 함수, 범위)
말그대로 필터입니다. 공기청정기, 에어컨에 들어가는 필터가 먼지를 걸러내듯 filter 도 참/거짓에 따라 걸러내는 역할을 하게 됩니다. 참이면 그대로 냅두고, 거짓이면 걸러내죠. 이 filter는 조금 특이한게 첫 번째 인자값이 함수인데 제공된 함수에 맞게 두 번째 인자로 들어온 값을 걸러내는 기능을 합니다. (조건 함수라고 써둔 이유입니다.)
조건 함수를 def로 선언해서 넣어줄 수 있지만 이름이 없는 함수인 람다식을 이용해서 간단하게 처리해봅시다.
한번 0~n 까지 짝수를 가져오는 프로그램을 만들어볼까요?
i = int(input('숫자를 입력해주세요 : '))
EvenNumExtractor = list(filter(lambda x : x%2 , range(i+1)))
print(EvenNumExtractor)
>>> [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47,
49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93,
95, 97, 99]
엇 이상하네요.. 원한건 짝수였는데 홀수가 나오네요 분명 filter 은 거짓만 걸러내는것일건데 왜 이럴까요?? 2로 나눠지는것들은 참, 2로 나눠지지 않는 것들은 거짓이 아닌가?
그렇게 생각을 하시면 안되고 0(false)이 거짓, 1(true)이 참이라는것을 유의해주셔야 합니다.
짝수들은 2에 나눠질것이니 나머지가 0이 되겠죠. 그러니 거짓이 되고 홀수들은 나눠지지 않아서 나머지가 남으니 1이 되서 참이 되게 됩니다 그러니 조건식을 아래와 같이 변경해 주어야 합니다.
i = int(input('숫자를 입력해주세요 : '))
EvenNumExtractor = list(filter(lambda x : x%2 == 0 , range(i+1)))
print(EvenNumExtractor)
>>> [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46,
48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92,
94, 96, 98, 100]
== 0 이 라는 조건을 추가해줘서 2로 나눠서 나머지가 0이 되는것을 참으로 처리한 모습입니다.
짝수가 잘 나오네요!
filter 바깥쪽에 list를 씌어주는 이유는 파이썬 최신버전이 되면서 문법이 조금 달라져서 filter만 쓰고 그대로 출력하면 오류가 납니다. 그래서 list()를 씌워주어서 filter이 반환하는 값이 리스트라고 컴퓨터에게 명시적으로 알려주고 출력하는 겁니다. 궁금하면 직접해보세요!
map(함수, 범위)
이 녀석도 filter랑 받는 매개 변수(인자)가 동일합니다.
map을 한마디로 설명하자면 범위(리스트, range 등등)에 있는 원소들을 꺼내서 각각 map 안에서
입력해준 함수에 넣어서 출력시켜주는건데요, 예제를 보시면 이해가 빠를겁니다.
i = int(input('4의 배수 몇개 만들까? : '))
multiply4 = list(map(lambda x : x * 4 , range(1,i+1)))
print(multiply4)
입력 : 10
>>> [4, 8, 12, 16, 20, 24, 28, 32, 36, 40]
1~ i+1 까지 있는 range를 하나 만들었고 그 range가 순차적으로 하나씩 돌면서
0 * 4 ... 만들어서 넣고 1*4 만들어서 넣고.. 이런식입니다.
filter처럼 list()를 통해 리스트로 명시적으로 변환해줍니다. 간단하죠?
reduce(함수, 순서형 자료)
reduce 함수는 순서형 자료(문자열, 리스트, 튜플)를 함수에 누적시킵니다.
from functools import reduce #reduce 함수 추가
print(reduce(lambda x,y: x+y, [1,2,3,4,5]))
>>> 15
reduce 함수에서 람다식에 1,2,3,4,5를 누적시켜서 더한 모습입니다.
여기서 from과 import의 뜻은 functools 란곳에 있는 reduce 함수를 파이썬에서 사용하겠다는 겁니다. (이 코드안에서) 누가 이미 만든 프로그래밍 소스 코드 파일을 흔히 "라이브러리" 또는 "모듈" 이라고 표현 합니다. 파이썬의 장점은 이와 같은 수 많은 라이브러리가 이미 구현되어 있기 때문에 우리는 이것을 가져다 쓰기만 하면 간편하게 프로그래밍을 완료할 수 있는 것입니다.
'프로그래밍 강좌 > Python [리뉴얼중]' 카테고리의 다른 글
[파이썬 강좌] #1 파이썬 알아보기 & 학습 방향 잡기 (0) | 2023.05.06 |
---|---|
[파이썬 강좌] #12 사전(Dictionary) (0) | 2022.04.22 |
[파이썬 강좌] #10 함수 사용하기 (0) | 2022.04.17 |
[파이썬 강좌] #9 반복문 사용하기 While편 (0) | 2022.04.16 |
[파이썬 강좌] #8 반복문 사용하기 For편 (0) | 2022.04.16 |