람다식(lambda)
람다 함수는 일반적으로 우리가 사용하는 함수와 비슷한데 람다 함수는 함수명이 없다. 그래서 이를 익명함수라고도 한다. 자바스크립트나 다른 언어에서 들어봤을 수 있다. 예제를 통해 한번 보자
사용하는 방법은 lambda (매개 변수) : [return 값] 의 형태이다.
1
2
3
4
5
6
7
8
9
10
11
12
|
def f():
print("python")
def ff(a,b):
return a*b
F = lambda : print("python")
FF = lambda a,b : a*b
if __name__ == "__main__":
print(ff(3,4))
print(f())
print(F())
print(FF(3,4))
|
함수와 람다 함수가 있다. 위 코드는 모두 같은 결과를 반환한다. 그럼 이것이 어떻게 좀 더 사용될까?
파이썬의 라이브러리인 map, filter 등에 사용될 수 있다. map은 여기서 사용하는것을 계속 볼 것이기에 정리하고 간다.
Map
함수와 자료구조를 인수로 받아 자료 구조의 모든 원소에 함수를 적용한 자료구조 반환, map은 입력받은 자료형의 각 요소를 함수 f가 수행한 결과를 묶어서 돌려주는 함수.
map은 list자료구와 자주 쓰인다. 필자의 이전글들을 보면 list와 map을 이용해서 문제들을 풀어보며 코드를 짰다. 여기서도 이와 같은 것을 사용하여 파이썬으로 코드를 짜본다. 우선 간단한 예제부터 확인하자.
1
2
3
4
5
6
7
8
9
10
|
List = [1,4,3,4,5,6]
List2 = [1,1,1,1,1,1]
arr = list(map(lambda x : 'null' if x % 3 == 0 else x,List))
print(arr)
#List에서 x(값)가 3으로 나누어떨어지면 해당 문자열로 바꿈
arr2 = list(map(lambda x : 'first' if x == 4 else 'second' if x == 5 else x * x,List))
print(arr2)
#List에서 x(값)가 4,5라면 해당 문자열로 바꾸가 나머지는 x*x로 바꿈
arr3 = list(map(lambda x,y : x+y,List,List2))
print(arr3)
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
arr은 list안에 map이 있고 이 map에 람다 함수가 있다. 람다 함수는 x가 3으로 나누어 떨어진다면 해당 값을 'null'로 바꾸고 그렇지 않으면 x를 그대로 둔다.
이와 같이 람다 함수를 사용하고 그 안에 if문을 사용하여 간결하게 사용할 수 있다. 나머지 코드는 주석을 참조하며 실행 결과는 아래와 같다.
자 그러면 list와 자주 쓰이는 map을 통해 몇몇 문제들을 살펴보자 정렬에 관한 문제를 볼 것이며 여기서 람다함수를 어떻게 다룰 수 있는 확인하자.
출처: https://www.acmicpc.net/problem/11651
1
2
3
4
5
6
7
8
9
10
|
import sys
n = int(input())
#print(arr)
#print(arr)
for _ in range(n):
print(arr[_][0],arr[_][1])
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
정렬하는 문제이다. arr은 list인데 라인별로 n번 읽어 리스트안에 2개의 값을 가지는 리스트로 저장한다.
파이썬 list의 함수인 sort()를 통해 정렬하는데 람다 함수가 있다. 이것은 정렬을 하는데 그 값을 a[0]를 기준으로 정렬하게 된다. 밑의 코드는 당연히 해당 arr을 a[1]을 기준으로 정렬하게 될 것이다. 직접 코드를 실행하여 확인할 수 있다.
출처: https://www.acmicpc.net/problem/1181
1
2
3
4
5
6
|
import sys
n = int(input())
print("".join(arr))
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
여기서도 sort()의 람다 함수만 보자. ()로 덮여있는데 이것은 앞의 내용을 적용하는데 같다면 뒤의 내용을 기준으로 정렬하게 된다. 즉, 길이별로 정렬을 하는데 길이가 같은 것이 있다면 f의 내용인 '문자열' 로 정렬한다. 문자열의 기본 정렬은 사전순이다.
뒤의 join은 리스트 내장 함수에 대해 정리하겠다. 이제 map, 람다 함수, 정렬에 대해 알았으니 다양한 문제에 적용하여 풀면 된다.
'python' 카테고리의 다른 글
[python] 리스트 정렬, 람다식, list 응용 (0) | 2020.03.29 |
---|---|
[Python]리스트 기본, split, 슬라이싱, 부분집합(Powerset) 구하기 (0) | 2019.09.10 |
[python] 파이썬 클래스 실습 및 정규식예제 (0) | 2019.08.26 |
[python] 파이썬 모듈_Module (0) | 2019.08.26 |
[python] 파이썬 클래스 (0) | 2019.08.13 |