Python] Lambda, 람다

Def, 함수

1
2
3
4
x = 3.0
print(type(x)) #<class 'float'>
# int로 변경할 수 있다면 True / 없다면 False
print(x.is_integer()) #True

아래의 내용을 보면 함수도 function 클래스의 객체를 생성한다는 것을 알 수 있다.

1
2
3
4
def func(n):
return n

print(type(func)) #<class 'function'>

객체가 완성된다면 매개변수(Parameter)로 전달할 수 있다는 것이다.

아래와 같이 사용할 수도 있다는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def func(n):
return n

def double(n):
return n ** 2

num = func(3)
print(double(num)
def sound(func):
func()

def person():
print('안녕하세요')

def dog():
print('멍멍')

def cat():
print('야옹')

sound(person) #안녕하세요
sound(dog) #멍멍
sound(cat) #야옹

위에 내용들이 이해되었다면, 조금 더 어려운 내용을 다뤄보자

1
2
3
4
5
6
7
def num(n):
def double(x):
return x ** n
return double

n = num(3)
print(n(3)) #27

Lambda, 람다

계속 호출하는 것이 아닌 필요에 의해 한 번 정도 사용해야하는 함수인데 함수명을 정하기에 어려운 경우가 있다. 그럴때 사용하는 함수를 람다라고 한다.

알고리즘 정렬에서 람다를 많이 사용해서 낯설진 않았다. 그렇지만 이외의 다른 사용법에 대해선 생각보다 낯설다는 것을 알 수 있었다.

위에서 알았던 함수도 객체라는 것을 잊어서는 안된다.

1
2
func = lambda value:print(value)
func('확인!')

위에 사용했던 함수들을 람다식으로 바꿔보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
"""
def func(n):
return n
"""

func = lambda n: n
print(func(3))
"""
def func(n):
return n

def double(n):
return n ** 2
"""

func = lambda n: n
double = lambda n: n ** 2

num = func(3)
print(double(num))

람다식에서는 매개변수를 쓰고 싶지 않을 때 비워주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
"""
def sound(func):
func()

def person():
print('안녕하세요')

def dog():
print('멍멍')

def cat():
print('야옹')
"""
sound = lambda func: func()
person = lambda : print('안녕하세요')
dog = lambda : print('멍멍')
cat = lambda : print('야옹')

sound(person)
sound(dog)
sound(cat)

지금까지 람다를 다루면서 어느 정도 눈치 챘겠지만, lambda에는 return을 사용하지 않는다. return을 사용할 경우에 SyntaxError가 발생한다. 자동적으로 return이 되어지며 return을 하지 않고 print로 출력할 수도 있다.

1
2
3
4
value = lambda x: len(x)

result = value('열심히 성실히 잘하기!')
print(result)

그러면 다소 어려웠던 중첩 함수를 람다식으로 바꿔보자.

1
2
3
4
5
6
7
8
9
10
11
"""
def num(n):
def double(x):
return x ** n
return double
"""
def num(n):
return lambda x: x ** n

num = num(3)
print(num(5)) #125