Python: lambda (람다)

dev-swd·2020년 10월 25일
0

python

목록 보기
13/23
post-thumbnail

람다식 : lambda experssion

  • 람다 표현식이라고 하며 이름이 없는 함수, 즉 익명 함수이다.
  • 람다 표현식의 본체에는 인라인 형식의 간단한 표현식만 올 수 있다.
  • 주로 다른 함수의 인수(파라미터)로 넘겨줄 때 많이 사용된다.

파라미터 x, y 를 더한 값을 리턴시켜주는 함수를 람다식으로 표현하면 아래와 같다.

# 일반 함수
def test_lambda(x, y):
    return x + y

# 람다식
lambda x, y: x + y

# lambda : 키워드
# x, y : 람다식 안에서 사용될 파라미터
# x + y : 람다식 안의 처리 코드 (자동으로 리턴)
  • 간단한 인라인 콜백함수를 만들거나, 함수 안에서 복잡한 처리를 할 수 없을 때 유용하다.
# 람다식으로 표현
Lambdas = [
    lambda x : x ** 2,
    lambda x : x ** 3,
    lambda x : x ** 4
]

for lambda_func in Lambdas:
    print( lambda_func(2) )


# 일반 함수로 하면?
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) )

람다 호출하기

람다 표현식을 스크립트 안에서 바로 호출하려면 아래와 같이 2가지의 방식이 있다.

# 변수로 만들어서 호출하기
lam = lambda x, y: x + y
r = lam(1, 2)

print(r) # 3

# (lambda 매개변수들: 식)(인수들)
r = (lambda x, y: x + y)(1, 2)

print(r) # 3

함수의 인자로 람다식 넣기

# 변수로 만들어서 인수로 넘기기
lam = lambda x, y: x + y

def print_xy(lam):
    result = lam
    print(result)

print_xy(lam(1, 2)) # 3


# 함수를 호출할 때 인자 값으로 람다식 넣기
def print_xy(func, hello):
    print(func(1, 2))
    print(hello)

print_xy((lambda x, y: x+y), "hello")

람다식의 대표적인 예는 map 내장 함수이다.

# 변수로 만들어서 인수로 넘기기
list(map(lambda x, y: x + y, [1, 2, 3]))

l = map(int, [i for i in range(1, 10)])
print(l)
  • map(function, iterable)
  • filter(function, iterable)
  • reduce(function, iterable) - 파이썬3? 이상 부터 내장 함수가 아니라서 import 시켜줘야 함

람다 표현식에 if 사용하기

lambda 매개변수들: 식1 if 조건식 else 식2
lambda 매개변수들: 식1 if 조건식1 else 식2 if 조건식2 else 식3


  1. 조건 식에 : 를 사용하지 않는다.
  2. else 는 반드시 있어야 한다.
  3. elif 는 사용할 수 없으며, 다중 조건을 걸기 위해서는 if else 를 다중으로 사용한다.
  4. 다중 조건이 여러 개 필요한 경우 그냥 일반 함수를 작성하는 것이 더 낫다.

정리

  1. 복잡한 연산이나 조건문을 사용해야 하는 경우에는, 되도록 람다식을 피한다.
  2. 람다식 안에서 새로운 변수를 생성할 수 없다.
  3. 리스트(딕셔너리, 세트) 표현식으로 처리할 수 있는 경우에는, 람다식 보다 각 자료형의 표현식을 사용한다.(가독성, 속도)

Wecode Assingment

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

import types

f = lambda x,y,z : x+y+z

print(f) # <function <lambda> at 0x10e3a7d30> 람다 함수 자체가 리턴됨

print(type(f)) # <class 'function'> 함수가 리턴됨

print(type(f) == types.LambdaType) # True 람다 타입이기 때문에 True 리턴
  • types 모듈에 LambdaType 외에 어떤 타입이 있을까

2. 다음과 같이 비밀번호의 길이와 대문자가 포함된것을 확인하는 간단한 함수를 람다식으로 바꿔보자.

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
profile
개발을 취미로 할 수 있는 그 때 까지

0개의 댓글