TIL # 29 Python- Lambda

강경훈·2020년 8월 25일
0
post-thumbnail

1. 콜백함수

  • 사용자가 직접 호출하는 함수가 아닌 어떠한 이벤트가 발생 했을 때(함수가 다른 함수에 의해 호출) 호출 되는 함수를 콜백 함수라도 한다.
  • map(), filter() 같은 내장 함수는 요소로 함수를 받는다. 이 때 요소로 받아진 함수는 map(), filter()에 의해 호출 되기 때문에 콜백함수라고 할 수 있다.

2. Lambda

  • 하나의 함수를 만드는 방법
    lambda 매개변수 : 반환값에 대한 식 (람다 표현식)
  • inline 함수 또는 익명함수라고 한다. (함수 이름 X)
  • 표현식 안에서는 새로운 변수를 만들 수 없다.
  • 람다 표현식 밖에 있는 변수는 사용 가능하다.
  • 식 한줄로 표현 할 수 있어야 된다.
  • 예)

1) add 함수

>> 함수로 표현
    def add (a,b):
    	return a+b
        
>> 람다로 표현
     lambda x, y: x+y

2) map() :콜백함수와 list을 이용해 새로운 list를 만드는 함수 (정확히는 객체)

L =[1,2,3,4,5]
lam = lambda = x : x*x
m = map(lam,L)
print(list(m))
>출력 결과
[1,3,9,16,25]
  • L 리스트의 각 요속의 제곱을 요소로 갖는 리스트를 생성

3) filter() : 특정 조건에 맞는 요소들만 뽑아서 리스트로 만드는 함수 (정확히는 객체)

L = [1,2,3,4,5]
lam = lambda x : x % 2 ==0
F = filter(lam, L)
print(list(F))
>출력 결과
[2, 4]
  • lambda 함수에서 짝수일 때 True을 반환하기 때문에, fiter()을 통해 짝수인 요소만 새롭게 뽑아 냈다.

map() 과 filter() 는 결과가 객체가 된다. 따라서 print()함수 등을 사용하려면 list()을 통해 자료형을 바꿔줘야 한다.

3. if가 포함된 lambda

  • 람가식 안에 조건문을 사용 할 수 있다.
    lambda 매개변수 : 반환식 if 조건 else 반환식
  • if을 사용하면 반드시 else까지 사용해야된다.
  • elif는 사용 할 수 없다. (else로 계속 사용)
  • (:)을 사용하지 않는다.
  • 예)
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 None

-lambda로만 이루어진 list을 통해 여러 조건을 연속적으로 확인 할 예정
-lambda1: 매개변수의 길이가 8보다 작으면 SHORT_PASSWORD' 반환, 8하고 같거나 크면 None 반환
-lambda2: 매개변수에 하나도 대문자가 없으면 'NO_CAPITAL_LETTER'을 반환 하나라도 있으면 None 반환

def check_password_using_lambda(password):

    for f in lambdas:
        if f(password) is not None:
            return f(password)
    return True

-for 문을 통해 f에 lambda1과 lambda2가 차례로 들어감.
-lambda의 반환값이 None이 아닐 경우 None이 아닌 반환값 return
-lambda1 과 lambda2 모두 반환값이 None일 경우 True return

print( check_password_using_lambda('123') )            
print( check_password_using_lambda('12356789f') )    
print( check_password_using_lambda('123456789fF') )   
> 출력 결과
SHORT_PASSWORD
NO_CAPITAL_LETTER_PASSWORD
True

4. types 모듈

import types

f = lambda x,y,z : x+y+z
print(f)
print(type(f))
print( type(f) == types.LambdaType)
>출력 결과
<function <lambda> at 0x10132e4c0>
<class 'function'>
True
  • types 모듈을 통해 여러 data type을 확인 할 수 있다.
  • lambda도 함수의 일종으로 class 'function'으로 출력되는 것을 볼수 있다.
  • 여러 종류의 타입들
    - FunctionType: 사용자 정의 함수의 타입
    - LambdaType: lambda 표현식이 만든 함수의 타입
    - GeneratorType: 제너레이터 함수가 만든, 제너레이터-이터레이터 객체의 타입
    - CorountineType: async def 함수가 만든 코루틴 객체의 타입
    - CodeType:
profile
방랑하는 개발자

0개의 댓글