Def, 함수
1 2 3 4
| x = 3.0 print(type(x))
print(x.is_integer())
|
아래의 내용을 보면 함수도 function 클래스의 객체를 생성한다는 것을 알 수 있다.
1 2 3 4
| def func(n): return n
print(type(func))
|
객체가 완성된다면 매개변수(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))
|
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))
|