람다는 인라인 함수를 정의할 때 사용하며, 익명 함수(anonymous functions) 또는 람다 표현식(lambda expression)이라고도 부른다.
우리가 배웠던 함수는 다음과 같다.
def name(arg1, arg2 ...):
block of statement
람다의 표현식은 다음과 같다.
lambda argument1, argument2, ... argumentN : expression using arguments
def add_func(x,y,z):
return x+y+z
print(add_func(1,2,3))
#lambda expression
f = lambda x,y,z : x+y+z
print(f) # <function <lambda> at 0x10343e710>
print(f(1,2,3))
람다는 간단한 인라인 콜백함수를 만들거나 함수 안에서 복잡한 처리를 할 수 없을 때 유용하다고 할수 있다.
callback function
: 다른 함수의 인자로써 이용되거나 어떤 이벤트에 의해 호출되어지는 함수
다음은 람다 함수의 적절한 사용의 예시다.
#function type
def square(x):
return x ** 2
def power_3(x):
return x ** 3
def power_4(x):
return x ** 4
powers = [ square, power_3, power_4 ]
for f in powers:
print( f(2) )
#lambda expression
Lambdas = [
lambda x : x ** 2,
lambda x : x ** 3,
lambda x : x ** 4
]
for lambda_func in Lambdas:
print( lambda_func(2) )
import types
f = lambda x,y,z : x+y+z
print(f)
print(type(f))
print( type(f) == types.LambdaType)
#출력결과
True
공식 문서 참조 결과, type
모듈에는 lambda와 같은 인스턴스나 서브클래스를 판별하기 위한 함수들이 있었다.
예를 들면 함수를 판별하는 FunctionType
, 제너레이터 함수를 판별하는 GeneratorType
, 모듈을 판별하는 ModuleType
, 사용자가 정의한 클래스의 메소드를 판별하는MethodType
등이 있다.
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 리스트안에 두개의 람다표현식을 작성해야하며 주석으로 표시된 프린트가 출력결과로 나와야 합니다.
lambdas = [
lambda x : "SHORT_PASSWORD" if len(x) < 8 else None,
lambda x : "NO_CAPITAL_LETTER_PASSWORD" if not any(a.isupper() for a in x) else None
]
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('123456789F') ) # True
lambda expression
에 조건문 형식이 들어가려면
lambda argument1, argument2, ... argumentN : expression using arguments
# expression using arguments : A if ~ else B
# if문이 True일때는 A를 반환, False일때는 B를 반환
lambdas = [
lambda x : "SHORT_PASSWORD" if len(x) < 8 else None,
lambda x : "NO_CAPITAL_LETTER_PASSWORD" if not any(a.isupper() for a in x) else None
isupper
매서드any
매서드check_password_using_lambda
함수에 의해 True 반환