[이솦] 파이선으로 배우는 AI 기초 12
- 람다 함수의 개념과 사용 방법에 대해 설명한다.
- 람다 함수는 코드를 간결하게 만들고 메모리를 절약하는 장점이 있다.
- 람다 함수는 간단한 함수나 임시 함수로 사용하기 유용하며, 다른 함수의 인자로 전달 가능하다.
함수를 배웠고 사용자 정의 함수에 대해서 배웠다. 그리고 내장함수와 내장 모듈에 대해서도 배웠다. 사용자 정의 함수는 매우 편리한 기능이긴 한데 함수가 필요하긴 하지만 함수를 가볍게 사용하고 다시 쓸 필요가 없을 때도 있다. 그 경우를 대비해서 쓰는 람다 (lamda) 함수를 살펴보자.
사용자 정의 함수를 쓸것 같지만 간단히 람다 함수를 쓰는 경우도 많음. 그렇다면 사용자 정의 함수를 쓰지 람따 함수를 쓸 필요가 있을까 생각할수 있지만 생각보다는 매우 유용하게 쓰이고 있다.
람다함수
파이썬에서는 람다 함수를 통해 이름이 없는 함수를 만들어 낼수 있다. 람다 함수의 장점은 코드의 간결함 메모리의 절약이다.
람다 함소는 결과 부분을 return 키워드 없이 자동으로 return 해준다.
def 함수 이름 (매개변수): lambda 매개변수: 결과
return 결과
익명 함수라는 이름처럼 lambda 함수는 함수의 이름을 지정하지 않는다.
print((lambda x: x+1) (3))
func = lambda x: x+1
print(func(4))
람다 함수는 인자로 받은 숫자에 +1을 해주는 함수 로 썼다.
lambda라고 지정하고 x를 지정하고 x는 x+1이라고 지정하고 3을 리턴해 준다. 이 함수는 프린트 함수 안에서 이름없이 사용되고 있고 이렇게 하면 4라는 값을 리턴해 준다.
함수에 이름이 없고, 저장된 변수가 없기 때문에 다시 사용할수가 없다. 하지만 재사용을 원하면 람다 함수도 객체이기 때문에 정의와 동시에 변수에 담을수는 있다. 일단 변수에 담으면 몇번 재사용할수 있다. 람다는 이름없는 함수지만 이름을 주게 되는 것이다. 이렇게 람다에 x를 지정하고 x+1을 func라는 함수로 지정하면 다시 사용 가능하다.
비교
sorted함수의 경우 매개변수 key에 값을 보내서 key 값에 따라서 정렬을 할수 있다.
target = ['cat', 'tiger', 'dog', 'snake']
def my_key(string):
return len(string.strip())
target = ['cat', 'tiger', 'dog', 'snake']
print(sorted(target, key=my_key))
target = ['cat', 'tiger', 'dog', 'snake']
print(sorted(target, key=lambda x : len(x.strip())))
조건이 알파벳 순서가 아니라, 앞뒤에 붙어 있는 불필요한 공백을 제외한 후 문자의 길이로 정렬하고 싶다고 가정해 보자.
람다 함수를 사용하지 않는다면 정렬의 기준으로 사용할 값으로 문자의 길이를 리턴하는 함수를 생성해서 sorted함수에 넘겨줘야 한다. 공백을 없앤 다음에 길이를 설정해 주는 사용자 함수를 만들고 그 사용자 함수에 리스트를 보내서 공백을 없앤 후에 공백 없는 길이를 반환하는게 일반적이다. 타겟이라는 리스트의 공백을 없애 주기 위해서 my_key라는 함수를 지정해 주고 길이를 구하되 공백잘라주는 strip이라는 함수를 정의해 준다. 그 함수를 통해서 길이를 잘라낸 문자열을 반환하도록 해주자. 즉 cat이면 3, tiger이면 5를 반환해 준다. 그리고 이것을 sorted함수 안에 넣어서 정렬해 주자. 정렬의 기준 즉 key값을 이용한다. 만약 my_key라는 함수가 프로그램 전체에서 오직 이부분에서만 사용한다고 가정해 보자. 공백을 빼는 것 외에 사용 안한다면 재사용 이유가 없다면 함수의 재사용성이 떨어지므로 lambda함수를 생성하여 넘겨주는 편이 낫다.
그래서 다음 코드처럼 lamba 함수를 이용하는것이 낫다.
lambda x라는 변수를 이용하는 데 코드와 같이 sorted함수의 key 값에 공백을 뺀 문자열의 길이를 반환하는 lambda함수를 생성하여 넣어 주는것이 효율적이다. 리스트 컴프리헨션 처럼 리스트를 이용한다고 생각하면 쉬우며 내장 함수인 map()을 함께 사용하면 그 장점을 더 잘 활용할수 있다. 리스트를 글자별로 정리한다고 넣어 주면 된다.
리스트에서 숫자값을 받아 10을 더한 새로운 리스트를 map함수를 이용해서 만들어 보자.
def plus(a):
return a + 10
list(map(plus, [1, 2, 3]))
list(map(lambda x: x+10, [1, 2, 3]))
먼저 매개변수로 함수를 이용해서 10에 더하는걸 먼저 만들어 보자. plus라는 함수를 만들어 쓸것이다.
map함수는 지금까지 공부한대로 map(함수, 이터러블)형태로 사용 가능하다. 리스트같은 이터러블에서 값을 받아 함수에서 처리해서 리턴한다.
map(plus, [1,2,3]) 이렇게 하면 1,2,3을 차례대로 불러서 plus함수에서 처리한 값을 리턴하는 방식으로 동작한다.
함수를 쓸수 있지만 람다함수를 쓰면 더 멋지게 할수 있다.
머신러닝 프로그램을 작성할때는 다양한 종류의 함수를 많이 사용한다. 외부 모듈도 많이 사용한다. 머신러닝 프로그램에서 람다 함수를 사용할때 주의 할점이 있다. 람따 함수를 표현할때 람다 표현식안에서는 새 변수를 정의할수 없다. 사용자 정의 함수를 그 안에서 변수를 다양하게 지정할수 있다. 하지만 람다 함수는 그안에서 변수를 사용할수 없다.
a = (lambda x: y=5; x+y)(3)
print(a)
<오류코드>
File "main.py", line 2
a= (lambda x: y=5; x+y)(1)
Λ
SyntaxError: invalid syntax
<오류 없는 코드>
y=5
a= (lambda x: x+y)(3)
print(a)
람다 함수가 어떤 수를 하나 받아 거기에 5를 더하는 동작을 하게 만드려고 해보자. 그래서 람다 x라고 하고 그후에 y라는 새로운 함수를 만들어서 5라고 지정하고 x 와 y를 더하게 하면 작동할것 같지만 작동하지 않는다. 람다 함수를 만들면서 안에 y값을 정의해 주면 뢰것 같지만 실제로는 오류가 발생한다. 머신러닝 프로그램은 매우 많은 연산동작을 하기 때문에 메모리를 많이 필요로 한다. 그래서 사용자 정의 함수를 이용할때도 있지만 메모리를 절약해 주는 람다 함수를 자주 사용하므로 하는것이 효율적이다. 이렇게 동작하는 람다 함수를 만드려면 람다 함수 안에서가 아니고 밖에서 변수를 정의해 줘야 한다. 앞으로 많이 볼것이므로 사용법을 익혀 두자.
실습
세금 구간을 나눠서 소득 기준에 따라서 다른 세율을 설정해보자.
money = eval(input('당신의 연수입을 입력하세요'))
taxrate = lambda a: 0.35 if a >= 88000000 else (0.24 if a >= 46000000
else (0.15 if a >= 12000000 else 0.06))
print('당신의 소득세는 %d 입니다'%(money*taxrate(money)))
람다 함수를 변수taxrate에 저장. 해서 람다 함수를 이용가능하다.
정리
람다 함수는 사용자 정의 함수를 간단히 설정해서 효율적인 프로그래밍을 할수 있게 한다.
람다 함수를 사용하면 메모리를 절약할수 있다.
람다 함수에 이름을 주면 여러번 사용할수 있다.
요즘은 프로그램의 메모리 사용 효율을 잘 따지지는 않는다. 하지만 프로그램이 빠르게 동작하기 위해 메모리를 아낄 필요가 있다. 람다 함수는 메모리를 절약하면서 함수의 효과를 낼수 있는 아주 좋은 방법이다.
람다함수에 대해서 좀더 물어보자.
간결함: 람다 함수는 한 줄로 작성할 수 있어 코드가 간결해지고 가독성이 향상됩니다. 짧은 함수나 간단한 연산에 유용합니다.
익명성: 이름을 지정할 필요 없이 함수를 정의할 수 있어, 일시적으로 필요한 함수에 적합합니다. 특히
map
,filter
,sorted
등의 함수와 함께 사용될 때 유용합니다.유연성: 람다 함수는 다른 함수의 인자로 전달될 수 있어 고차 함수(higher-order function)와 함께 사용할 때 코드의 유연성과 재사용성을 높입니다.
람다 함수는 사용이 간편하며, 특히 간단한 기능을 구현할 때 유용한 도구입니다. 다만, 복잡한 로직이 필요한 경우에는 명시적인
def
키워드를 사용한 함수 정의가 가독성과 유지보수에 더 적합합니다.
gpt에서는 이렇게 나온다.