핵심 정리

람다 표현식

람다 표현식은 간단한 식으로 함수를 만들 때 사용합니다. 특히 람다 표현식으로 만든 함수는 이름이 없어서 익명 함수라고 부르기도 합니다. 람다 표현식 자체를 호출하려면 람다 표현식을 ( )(괄호)로 묶은 뒤 다시 ( )를 붙이고 인수를 넣어서 호출합니다.

lambda 매개변수1, 매개변수2: 반환값                    # 람다 표현식으로 함수를 만듦
(lambda 매개변수1, 매개변수2: 반환값)(인수1, 인수2)    # 람다 표현식 자체를 호출
 
lambda 매개변수1, 매개변수2: 1 if 조건식 else 2    # 람다 표현식에서 조건부 표현식 사용
lambda x: str(x) if x % 3 == 0 else x
 
lambda 매개변수1, 매개변수2: 1 if 조건식1 else 2 if 조건식2 else 3  # if를 여러 개 사용
lambda x: str(x) if x == 1 else float(x) if x == 2 else x + 10

변수의 사용 범위

전역 변수는 스크립트 전체에서 접근할 수 있으며 지역 변수는 해당 함수 안에서만 접근할 수 있습니다. 만약 함수 안에서 전역 변수를 사용하려면 global에 변수 이름을 지정해줍니다.

x = 10    # 전역 변수
 
def foo():
    global x   # 전역 변수 x를 사용하겠다고 설정
    y = 10     # foo의 지역 변수

만약 전역 변수가 없을 때 함수 안에서 global을 사용하면 해당 변수는 전역 변수가 됩니다.

함수 안에서 함수 사용하기

파이썬에서는 def로 함수를 만들고 다시 def로 함수를 만들 수 있습니다.

def 함수이름1():
    코드
    def 함수이름2():
        코드

함수 안에 함수를 만들었을 때 안쪽 함수에서 바깥쪽 함수의 지역 변수를 변경하려면 nonlocal에 변수 이름을 지정해줍니다.

def A():
    x = 10        # A의 지역 변수 x
    def B():
        nonlocal x    # 현재 함수에서 바깥쪽에 있는 지역 변수를 사용
        x = 20        # A의 지역 변수 x에 20 할당

클로저

클로저는 함수를 둘러싼 환경(지역 변수, 코드 등)을 계속 유지하다가 함수를 호출할 때 다시 꺼내서 사용하는 함수를 뜻합니다. 따라서 클로저는 지역 변수와 코드를 묶어서 사용하고 싶을 때 활용합니다. 또한, 클로저에 속한 지역 변수는 바깥에서 직접 접근할 수 없으므로 데이터를 숨기고 싶을 때 활용합니다.

def calc():    # calc 함수 안에 mul_add 함수를 만듦
    a = 3
    b = 5
    def mul_add(x):
        return a * x + b    # 함수 바깥쪽에 있는 지역 변수 a, b를 사용하여 계산
    return mul_add          # mul_add 함수를 반환
 
c = calc()    # c에 저장된 함수가 클로저
print(c(1), c(2), c(3), c(4), c(5))    # 8 11 14 17 20

클로저는 람다 표현식으로도 만들 수 있습니다.

def calc():
    a = 3
    b = 5
    return lambda x: a * x + b    # 람다 표현식을 반환

람다와 클로저

보통 클로저는 람다와 함께 사용하는 경우가 많아 둘을 혼동하기 쉽습니다. 람다는 이름이 없는 익명 함수를 뜻하고, 클로저는 함수를 둘러싼 환경을 유지했다가 나중에 다시 사용하는 함수를 뜻합니다.