람다는 인라인(in-line=한 줄)함수를 정의할 때 사용하며 익명 함수(anonymous functions) 또는 람다 표현식(lambda expression)이라고 부른다. 일반적인 함수는 다음과 같은 형식을 가지고 있다.
def name(arg1, arg2...):
block of statement
람다와의 차이점은 첫 번째는 이름의 유무이며 두 번째는 함수는 내부에서 처리하는 로직들과 여러문장으로 작성하는 블록으로 구성할 수 있는 반면, 람다 표현식의 본체에는 인라인 형식의 간단한 표현식만 올 수 있고 함수와 같이 return문 없이도 표현식의 결과가 리턴이 된다. 람다 표현식도 nested 될 수 있고 다소 복잡한 구조를 가질 수 있지만 람다의 가장 일반적인 형식은 다음과 같다.
lambda arg1, arg2,....... argN : expression using arg
f = lambda x,y,z = x+y+z print(f(1,2,3))
또한 람다는 간단한 인라인 콜백함수를 만들거나 함수안에서 복잡한 처리를 할 수 없을 때 유용하다고 할 수 있다. 콜백함수란 어떤 이벤트가 발생했을 때 호출되는 함수인데 콜백함수가 여러블록으로 구성된 실행문이 아니고 다른 컴포넌트에서 사용되지 않는다면 해당 컴포넌트만을 위한 람다 표현식이 적절할 것 이다.
Lambdas = [ lambda x : x ** 2, lambda x : x ** 3, lambda x : x ** 4 ] for lambda_func in Lambdas: print( lambda_func(2) 결과값 : 4, 8, 16
1번 문제 :
다음 코드를 실행해보고 print문으로 출력되는 출력결과를 확인해보고 types 모듈에 LambdaType 외에도 어떤 타입들이 있는지 조사해 보세요.
import types f = lambda x,y,z : x+y+z print(f) print(type(f)) print(type(f) == types.LambdaType
결과값 :
SyntaxError : unexpected E0F while Parsing
소괄호가 제대로 안 닫혀있어서 나온 결과고, 제대로 구문 수정을 수정을 하면
class ='function'
이라는 결과값이 도출된다. lambda의 데이터형식이 function 이라는 의미다. type()함수는 괄호안에 주어진 값의 데이터형식이 무엇인지 알아내는 함수다. f는 lambda함수로 짜여진 구문이므로 당연히 function이라고 주어지며 type(f) 대신 types.LambdaType을 넣어도 동일한 결과값이 나온다.(class ='function')
built_in module
에 속하는 types module
에는 다양한 함수와 클래스등이 내장되어있다.
파이썬2 버전에서는 총 37개였으나 intType같이 자주 쓰이면 type들을 int형으로 간소화함에 따라 현재버전(3.8)에서는 29개가 존재하고 있다. 다음은 dir함수와 len함수를 이용해 types의 종류의 개수를 반환한 코드다.
결과값 : types 모듈은 총 29개이고 ['AsyncGeneratorType', 'BuiltinFunctionType', 'BuiltinMethodType', 'CellType', 'ClassMethodDescriptorType', 'CodeType', 'CoroutineType', 'DynamicClassAttribute', 'FrameType', 'FunctionType', 'GeneratorType', 'GetSetDescriptorType', 'LambdaType', 'MappingProxyType', 'MemberDescriptorType', 'MethodDescriptorType', 'MethodType', 'MethodWrapperType', 'ModuleType', 'SimpleNamespace', 'TracebackType', 'WrapperDescriptorType', '_GeneratorWrapper', 'all', 'builtins', 'cached', 'doc', 'file', 'loader', 'name', 'package', 'spec', '_calculate_meta', '_cell_factory', 'coroutine', 'new_class', 'prepare_class', 'resolve_bases']가 있다.
2번 문제 :
다음과 같이 비밀번호의 길이와 대문자가 포함된것을 확인하는 간단한 함수가 있습니다.
def check_password(password): if len(password) < 8: return 'SHORT_PASSWORD' if not any(c.isupper() for c in password): return 'NO_CAPITAL_LETTER_PASSWORD' return True
이함수에 있는 if문 두개를 람다표현식을 이용하여 다음과 같은 형식으로 작성해 보세요. 아래의 lambdas 리스트안에 두개의 람다표현식을 작성해야하며 주석으로 표시된 프린트가 출력결과로 나와야 합니다.
python lambdas = [ ] def check_password_using_lambda(password): for f in lambdas: if f(password) is not None: return f(password) return True print( check_password_using_lambda('123') ) '''SHORT_PASSWORD''' print( check_password_using_lambda('12356789f') ) '''NO_CAPITAL_LETTER_PASSWORD''' print( check_password_using_lambda('123456789fF') ) '''True'''
정답 :
*주의점 :
1) lambda와 lambda사이에는 반드시 쉼표(,)를 넣어야한다.
2) lambda와 if구문을 같이 쓸 경우에는 else문을 꼭 집어넣어줘야한다.