We.TIL 10 : Lambda(람다)

김기욱·2020년 7월 27일
0

We.TIL

목록 보기
15/69

람다란 무엇인가?

람다는 인라인(in-line=한 줄)함수를 정의할 때 사용하며 익명 함수(anonymous functions) 또는 람다 표현식(lambda expression)이라고 부른다. 일반적인 함수는 다음과 같은 형식을 가지고 있다.

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

람다와의 차이점은 첫 번째는 이름의 유무이며 두 번째는 함수는 내부에서 처리하는 로직들과 여러문장으로 작성하는 블록으로 구성할 수 있는 반면, 람다 표현식의 본체에는 인라인 형식의 간단한 표현식만 올 수 있고 함수와 같이 return문 없이도 표현식의 결과가 리턴이 된다. 람다 표현식도 nested 될 수 있고 다소 복잡한 구조를 가질 수 있지만 람다의 가장 일반적인 형식은 다음과 같다.

lambda arg1, arg2,....... argN : expression using arg

f = lambda x,y,z = x+y+z
print(f(1,2,3))

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

Lambdas = [
    lambda x : x ** 2,
    lambda x : x ** 3,
    lambda x : x ** 4
]
for lambda_func in Lambdas:
    print( lambda_func(2) 
결과값 : 4, 8, 16

Assignments

1번 문제 :
다음 코드를 실행해보고 print문으로 출력되는 출력결과를 확인해보고 types 모듈에 LambdaType 외에도 어떤 타입들이 있는지 조사해 보세요.

import types
f = lambda x,y,z : x+y+z
print(f)
print(type(f))
print(type(f) == types.LambdaType

결과값 :
SyntaxError : unexpected E0F while Parsing

소괄호가 제대로 안 닫혀있어서 나온 결과고, 제대로 구문 수정을 수정을 하면
class ='function' 이라는 결과값이 도출된다. lambda의 데이터형식이 function 이라는 의미다. type()함수는 괄호안에 주어진 값의 데이터형식이 무엇인지 알아내는 함수다. f는 lambda함수로 짜여진 구문이므로 당연히 function이라고 주어지며 type(f) 대신 types.LambdaType을 넣어도 동일한 결과값이 나온다.(class ='function')

built_in module에 속하는 types module에는 다양한 함수와 클래스등이 내장되어있다.
파이썬2 버전에서는 총 37개였으나 intType같이 자주 쓰이면 type들을 int형으로 간소화함에 따라 현재버전(3.8)에서는 29개가 존재하고 있다. 다음은 dir함수와 len함수를 이용해 types의 종류의 개수를 반환한 코드다.


결과값 : types 모듈은 총 29개이고 ['AsyncGeneratorType', 'BuiltinFunctionType', 'BuiltinMethodType', 'CellType', 'ClassMethodDescriptorType', 'CodeType', 'CoroutineType', 'DynamicClassAttribute', 'FrameType', 'FunctionType', 'GeneratorType', 'GetSetDescriptorType', 'LambdaType', 'MappingProxyType', 'MemberDescriptorType', 'MethodDescriptorType', 'MethodType', 'MethodWrapperType', 'ModuleType', 'SimpleNamespace', 'TracebackType', 'WrapperDescriptorType', '_GeneratorWrapper', 'all', 'builtins', 'cached', 'doc', 'file', 'loader', 'name', 'package', 'spec', '_calculate_meta', '_cell_factory', 'coroutine', 'new_class', 'prepare_class', 'resolve_bases']가 있다.

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 리스트안에 두개의 람다표현식을 작성해야하며 주석으로 표시된 프린트가 출력결과로 나와야 합니다.

python
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'''

정답 :


*주의점 :
1) lambda와 lambda사이에는 반드시 쉼표(,)를 넣어야한다.
2) lambda와 if구문을 같이 쓸 경우에는 else문을 꼭 집어넣어줘야한다.

profile
어려운 것은 없다, 다만 아직 익숙치않을뿐이다.

0개의 댓글