Closure란?
중첩 함수가 부모 함수의 변수나 정보를 가두어 사용 하는 것을 말한다.
👉 어떤 정보를 기반으로 연산을 실행하고 싶지만 기반이 되는 정보는 접근을 제한하여 노출되거나 수정되지 못하게 하고 싶을때 사용된다.
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로 셋팅 되어 있는 함수
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를 반환한다.