lambda expressions

Junyoung Kim·2022년 1월 5일
0

Python+

목록 보기
4/7

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


우리가 배웠던 함수는 다음과 같다.

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

람다는 함수 표현식와 다르게 이름이 존재하지 않고, 여러 줄이 존재하는 함수와는 다르게 간단한 표현식인 인라인 형식이며, return 없어도 결과값이 리턴된다.

람다의 표현식은 다음과 같다.

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

변수 x,y,z을 곱하는 함수 `add_func`는 람다 표현식으로 다음과 같이 나타낼 수 있다.
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) )

람다 함수를 이용해 간결하게 코드를 바꾼 것을 확인할 수 있다.

Assignment

  1. 다음 코드를 실행해보고 print문으로 출력되는 출력결과를 확인해보고 types 모듈에 LambdaType 외에도 어떤 타입들이 있는지 조사해 보세요.
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등이 있다.

  1. 다음과 같이 비밀번호의 길이와 대문자가 포함된것을 확인하는 간단한 함수가 있습니다.
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
  1. 변수로 받은 x의 길이가 8보다 작을때는 "SHORT_PASSWORD" 반환, 길때는 None 반환
  2. 문자열에 대문자가 하나라도 있을 때 True를 반환받는 isupper 매서드
    반복 가능한 자료형(iterable)에서 요소 중 하나라도 True일경우 True를 반환하는 any 매서드
    -> if not이므로 x를 받았을 때 대문자가 하나라도 없을 때 "NO_CAPITAL_LETTER_PASSWORD" 반환, 있을 때 None 반환
  3. None을 반환 받은 경우는 길이가 8자보다 길고 대문자가 있는 경우이므로 check_password_using_lambda 함수에 의해 True 반환

0개의 댓글