lambda expressions

Ju Seol·2021년 6월 10일
0

람다는 인라인 함수를 정의할 때 사용하며 익명 함수(anonymous functions) 또는 람다 표현식(lambda expression)이라고 부릅니다.

일반 함수 형식

def name(arg1, arg2 ...):
    block of statement

람다 함수 형식

lambda argument1, argument2, ... argumentN : expression using arguments

람다

f = lambda x,y,z : x+y+z

print(f) # <function <lambda> at 0x10343e710>
print(f(1,2,3))

일반 함수

def add_func(x,y,z):
	return x+y+z

함수로 다시 작성한 함수를 보면 람다에 한줄로 return x+y+z 를 쓸 수 있을 것 같지만 람다는 표현식이므로 return을 사용할 수 없습니다.

그렇다면 언제 람다 함수를 사용할까?

다음과 같은 간단한 인라인 콜백함수를 만들거나 함수안에서 복잡한 처리를 할 수 없을 때 유용하다고 할 수 있습니다. 콜백함수란 어떤 이벤트가 발생했을때 호출되는 함수인데 콜백함수가 여러블록으로 구성된 실행문이 아니고 다른 컴포넌트에서 사용되지 않는다면 해당 컴포넌트만을 위한 람다 표현식이 적절할 것 입니다.

다음과 같은 어떤 정수에 2제곱, 3제곰, 4제곱을 하는 예제에서 함수로 구현하는 것보다 람다로 구현하는 것이 낫겠죠?

Lambdas = [
    lambda x : x ** 2,
    lambda x : x ** 3,
    lambda x : x ** 4
]

for lambda_func in Lambdas:
    print( lambda_func(2) )

이것을 함수로 구현하면 다음과같이 구현할 수 있지만 간단함 함수임에도 함수이름을 만들어야하고 다른 함수이름과 충돌이 발생할 가능성이 있을 수 있습니다. 딱 봐도 람다 표현식을 사용한 코드가 깔끔하죠 ? 이렇게 람다는 함수가 사용되는 위치에 인라인 표현식으로 대체되는 경우 간편한 방법을 제공합니다.

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) )

문제.
다음과 같이 비밀번호의 길이와 대문자가 포함된것을 확인하는 간단한 함수가 있습니다.

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 = [ 

]

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

답변.

lambdas = [
    lambda x: "Short_Password" if len(x)<8 else None,
    lambda x: "No_capital_letter_password" if not any(c.isupper() for c in x) else True
]

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
profile
Hello!

0개의 댓글