33. 클로저

Joy·2020년 4월 1일
0

변수의 범위

전역변수: 함수를 포함하여 스크립트 전체에서 접근할 수 있는 변수(global variable)
전역 범위(global scope): 전역 변수에 접근할 수 있는 범위

지역 변수(local variable): 변수를 만든 함수 안에서만 접근
지역 범위(local scope): 지역 변수를 접근할 수 있는 범위

! 전역변수를 함수 안에서 바꾸면 -> 새로운 지역변수로 됨.
함수 안에서 전역변수를 바꾸려면

global 전역변수이름

x = 10          # 전역 변수
def foo():
    global x    # 전역 변수 x를 사용하겠다고 설정
    x = 20      # x는 전역 변수
    print(x)    # 전역 변수 출력
 
foo()
print(x)        # 전역 변수 출력

함수 안에 함수 만들기

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

변수 범위 구분

def A():
    x = 10        # A의 지역 변수 x
    def B():
        x = 20    # x에 20 할당
 
    B()
    print(x)      # A의 지역 변수 x 출력
 
A()

결과: 10

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

결과: 20

현재 함수 바깥에 있는 지역변수 사용하려면

  • nonlocal 지역변수
    nonlocal은 현재 함수의 바깥쪽에 있는 지역 변수를 찾을 때 가장 가까운 함수부터 먼저
    global 키워드: 무조건 전역변수

클로저

클로저(closure) : 함수를 둘러싼 환경(지역 변수, 코드 등)을 계속 유지하다가, 함수를 호출할 때 다시 꺼내서 사용하는 함수

클로저는 지역 변수와 코드를 묶어서 사용하고 싶을 때 활용

예시

def calc():
    a = 3
    b = 5
    def mul_add(x):
        return a * x + b    # 함수 바깥쪽에 있는 지역 변수 a, b를 사용하여 계산
    return mul_add          # mul_add 함수를 반환
 
c = calc()	#함수 calc를 호출한 뒤 반환값을 c에 저장( c에는 함수 mul_add가 들어)
print(c(1), c(2), c(3), c(4), c(5))

결과: 8 11 14 17 20

함수 calc가 끝났는데도 c는 calc의 지역 변수 a, b를 사용해서 계산. c에 저장된 함수가 클로저입니다.

람다로 콜로저 만들기

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

문제: 카운트 다운 함수 만들기

표준 입력으로 정수가 입력됩니다. 다음 소스 코드를 완성하여 함수 c를 호출할 때마다 숫자가 1씩 줄어들게 만드세요. 여기서는 함수를 클로저로 만들어야 합니다.

def countdown(n):
	i = n+1
    	def new():
        	nonlocal i
            i -= 1
            return i
    return new

n = int(input())
 
c = countdown(n)
for i in range(n):
    print(c(), end=' ')

i를 n+1로 할당하고 1씩 감소하는 new함수 만듦.

profile
roundy

0개의 댓글