함수 고급(2) 람다
람다
요즘 프로그래밍 언어에서는 함수라는 '기능'을 매개변수로 전달하는 코드를 많이 사용함
그리고 이런 코드를 더욱 효율적으로 작성할 수 있도록 파이썬은 람다(lambda)라는 기능을 제공함
(1) 함수의 매개변수로 함수 전달하기
# 매개변수로 받은 함수를 10번 호출하는 함수
def call_10_times(func):
for i in range(10):
func()
# 간단한 출력하는 함수
def print_hello():
print("안녕하세요")
# 조합하기
call_10_times(print_hello)
</>
안녕하세요
안녕하세요
안녕하세요
안녕하세요
안녕하세요
안녕하세요
안녕하세요
안녕하세요
안녕하세요
안녕하세요
프로그램을 실행하면 print_hello() 함수를 10번 실행.
따라서 "안녕하세요" 라는 문자열을 10번 출력함
(2) filter() 함수와 map() 함수
함수를 매개변수로 전달하는 대표적인 표준함수로 map(), filter() 함수가 있음
map() 함수는 리스트의 요소를 함수에 넣고 리턴된 값으로 새로운 리스트를 구성해주는 함수
map(함수, 리스트)
filter() 함수는 리스트의 요소를 함수에 넣고 리턴된 값이 True인 것으로, 새로운 리스트를 구성해주는 함수
filter(함수, 리스트)
map() 함수와 filter() 함수
# 함수 선언
def power(item):
return item * item
def under_3(item):
return item < 3
# 변수 선언
list_input_a = [1, 2, 3, 4, 5]
# map() 함수 사용
output_a = map(power, list_input_a)
print("# map() 함수의 실행결과")
print("map(power, list_input_a):", output_a)
print("map(power, list_input_a):", list(output_a))
print()
# filter() 함수 사용
output_b = filter(under_3, list_input_a)
print("# filter() 함수의 실행결과")
print("filter(under_3, list_input_a):", output_b)
print("filter(under_3, list_input_a):", list(output_b))
</>
# map() 함수의 실행결과
map(power, list_input_a): <map object at 0x7fbc75e9bdf0>
map(power, list_input_a): [1, 4, 9, 16, 25]
# filter() 함수의 실행결과
filter(under_3, list_input_a): <filter object at 0x7fbc75e9b160>
filter(under_3, list_input_a): [1, 2]
map() 함수와 filter() 함수는 모두 첫 번째 매개변수에 함수, 두 번째 매개변수에 리스트를 넣었음.
map() 함수 : 첫번째 매개변수에는 값을 제곱해주는 power() 함수를 넣었음. 두번째 매개변수에는 [1, 2,3,4,5] 라는 리스트를 넣음. 그리고 결과로 [1,2,3,4,5] 내부의 요소에 power()함수가 적용된 [1, 4,9,16,25]를 얻음
filter() 함수 : 첫번째 매개변수에는 item<3을 판정하는 under_3() 함수를 넣음. 두번째 매개변수에는 [1,2,3,4,5]라는 리스트를 넣었음. 그리고 결과로 [1,2,3,4,5] 내부의 요소중에 item < 3 이 True 인 [1,2] 를 얻었음.
결과로 <map object> 와 <filter object>가 나오는데, 이는 제너레이터라고 부름.
여기에 list() 함수를 적용해서 강제로 리스트 자료형으로 변환해 출력함.
(3) 람다의 개념
람다는 '간단한 함수를 쉽게 선언하는 방법'
lambda 매개변수: 리턴값
위의 코드를 람다로 변경하면, power() 함수와 under_3() 함수가 다음과 같은 코드가 됨
def 키워드로 선언한 함수를 lambda 함수로 바꾸고, return 키워드를 따로 쓰지 않았다는 정도의 차이가 생김
# 함수 선언
power = lambda x: x*x
under_3 = lambda x: x<3
# 변수 선언
list_input_a = [1, 2, 3, 4, 5]
# map() 함수 사용
output_a = map(power, list_input_a)
print("# map() 함수의 실행결과")
print("map(power, list_input_a):", output_a)
print("map(power, list_input_a):", list(output_a))
print()
# filter() 함수 사용
output_b = filter(under_3, list_input_a)
print("# filter() 함수의 실행결과")
print("filter(under_3, list_input_a):", output_b)
print("filter(under_3, list_input_a):", list(output_b))
</>
# map() 함수의 실행결과
map(power, list_input_a): <map object at 0x7f8f37fa3d90>
map(power, list_input_a): [1, 4, 9, 16, 25]
# filter() 함수의 실행결과
filter(under_3, list_input_a): <filter object at 0x7f8f37fa3160>
filter(under_3, list_input_a): [1, 2]
그러나 람다를 사용해도 위의 코드는 복잡하게 보일 수 있음.
그래서 람다는 함수의 매개변수에 곧바로 넣을 수 있음. 이렇게 하면 코드가 굉장히 깔끔해짐
# 변수 선언
list_input_a = [1, 2, 3, 4, 5]
# map() 함수 사용
output_a = map(lambda x: x*x, list_input_a)
print("# map() 함수의 실행결과")
print("map(power, list_input_a):", output_a)
print("map(power, list_input_a):", list(output_a))
print()
# filter() 함수 사용
output_b = filter(lambda x: x<3, list_input_a)
print("# filter() 함수의 실행결과")
print("filter(under_3, list_input_a):", output_b)
print("filter(under_3, list_input_a):", list(output_b))
실행결과는 이전과 같음.
람다를 사용하면 코드를 더 깔끔하게 작성할 수 있고 함수가 매개변수로 넣어졌따고 확인하고 어떤 함수인지 알기 위해 다시 찾아 올라가는 수고를 하지 않아도 됨
또한 매개변수가 여러 개인 람다도 만들 수 있음
lambda x, y : x * y
이런 식으루!