[python] 클로저 사용하기

anjiyoo·2024년 3월 6일

Python

목록 보기
32/41
post-thumbnail

1.변수의 사용 범위 알아보기

  • 전역 변수 global variable : 스크립트 전체에서 접근할 수 있는 변수
x = 10  # 전역 변수
def foo():
	print(x)  # 전역 변수 출력

foo()
print(x)  # 전역 변수 출력
  • 지역 변수 local variable : 변수를 만든 함수 안에서만 접근
def foo():
	x = 10  # foo의 지역 변수
    print(x)  # foo의 지역 변수 출력
    
foo()
print(x)  # 에러. foo의 지역변수는 출력할 수 없음

1-1.함수 안에서 전역 변수 변경하기

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

2.함수 안에서 함수 만들기

def 함수이름1():
	코드
    def 함수이름2():
    	코드
def print_hello():
	hello = 'Hello, world!'
    def print_message():
    	print(hello)
    print_message()
print_hello()

2-1.지역 변수의 범위

def print_hello():
	hello = 'Hello, world'  # 전역 변수
    def pirnt_message():
    print(hello)  # 바깥쪽 함수의 지역 변수를 사용

2-2.지역 변수 변경하기

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

A()

2-3.nonlocal이 변수를 찾는 순서

  • nonlocal은 현재 함수의 바깥쪽에 있는 지역 변수를 찾을 때 사용
  • 가장 가까운 함수부터 먼저 찾음
def A():
 x = 10
 y = 100
 def B():
 	x = 20
    def C():
    	nonlocal x
        nonlocal y
        x = x + 30
        y = y + 300
        print(x)
        print(y)
    C()
  B()
A()

2-4.global로 전역 변수 사용하기

  • 함수가 몇 단계든 상관없이 global 키워드를 사용하면 무조건 전역 변수 사용
  • 가급적 사용하지 않는 것이 좋음
x = 1
def A():
 x = 10
 def B():
 	x = 20
    def C():
    	global x
        x = x + 30
        print(x)
    C()
  B()
  
A()

3.클로저 사용하기

  • 클로저 : 함수를 들러싼 환경을 계속 유지하다가, 함수를 호출할 때 다시 꺼내서 사용하는 함수
  • 클로저를 사용하면 프로그램의 흐름을 변수에 저장할 수 있음
  • 지역변수와 코드를 묶어서 사용하고 싶을 때 활용
  • 클로저에 속한 지역 변수는 바깥에서 직접 접근할 수 없어서 데이터를 숨기고 싶을 때 활용
def calc():
	a = 3
    b = 5
    def mul_add(x):
    	return a * x + b  # 함수 바깥쪽에 있는 지역 변수 a,b를 사용하여 계산
    return mul_add  # mul_add 함수를 반환
    
c = calc()
print(c(1), c(2), c(3), c(4), c(5))

3-1.lambda로 클로저 만들기

  • 람다 : 이름 없는 함수
  • 클로저 : 함수를 둘러싼 환경을 유지했다가 나중에 다시 사용하는 함수
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))

3-2.클로저의 지역 변수 변경하기

def calc():
	a = 3
    b = 5
    total = 0
    def mul_add(X):
    	nonlocal total
        total = total + a * x + b
        print(total)
    return mul_add
    
c = calc()
c(1)
c(2)
c(3)
profile
기록으로 흔적을 남기는 것을 좋아합니다

0개의 댓글