[Python] Function - Closure & Lambda

가비·2020년 9월 30일
0

[Python] Function

목록 보기
3/5

Closure란? 중첩 함수가 부모 함수의 변수나 정보를 가두어 사용 하는 것을 말한다.

closure

  • 중첩 함수가 부모 함수의 변수나 정보를 중첩 함수 내에서 사용한다.
  • 부모 함수는 리턴값으로 중첩 함수를 리턴한다.
  • 부모 함수의 변수는 직접적인 접근이 불가능 하지만 부모 함수가 리턴한 중첩 함수를 통해 사용될 수 있다.

👉 어떤 정보를 기반으로 연산을 실행하고 싶지만 기반이 되는 정보는 접근을 제한하여 노출되거나 수정되지 못하게 하고 싶을때 사용된다.

example

def generate_power(base_number):
    def nth_powor(power):           # closure
        return base_number ** power # 부모 함수의 변수인 base_number가 격리되어 사용됨 
    return nth_power                # 중첩 함수가 부모 함수의 리턴값으로 리턴
    
power_of_two = generate_power(2)
power_of_two(7)                     # base_number가 이미 2로 셋팅 되어 있는 함수

lambda

def generate_power(base_number):
    return lambda power: base_number ** power

lambda란? 인라인 함수를 정의할 때 사용하며 익명 함수 또는 람다 표현식이라고 한다.

# 비밀번호의 길이와 대문자의 포함 여부를 확인하는 함수
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

# 람다를 사용하면👇
lambdas = [lambda password : 'SHORT_PASSWORD' if len(password) < 8 else None,
           lambda password : 'NO_CAPITAL_LETTER_PASSWORD' if not any(c.isupper() for c in password) 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('123456789fF')) # True

👉 람다 표현식에서 if를 사용했다면 반드시 else를 명시해야 하고 elif는 사용할 수 없다.

  • if not 조건이 만족되지 않았을때 실행
  • any() 반복 가능한 객체를 인수로 받으며 요소가 모두 거짓일때만 False를 반환한다.(하나라도 참이 있으면 True 반환)
  • isupper() 문자가 대문자인 경우에만 True를 반환한다.

0개의 댓글