python
Python 클로저 작동 원리, 정의 방법, 깔끔하고 효율적 코드에 필수인 이유 알아보기.
클로저 탐구 전 중첩 함수와 비로컬 변수 이해 필수. 다른 함수 안에 정의된 함수를 중첩 함수라 함. 이런 함수는 외부 스코프 변수 읽기 가능.
Python에서 비로컬 변수는 기본적으로 읽기 전용. 수정하려면 중첩 함수 내에서 nonlocal로 명시적 선언 필요.
중첩 함수가 외부 스코프 변수 접근하는 간단 예제:
def print_msg(msg):
# 외부 함수
def printer():
# 중첩 함수
print(msg)
printer()
print_msg("Hello")
출력
Hello
중첩 printer() 함수가 외부 스코프 msg 변수 접근.
외부 함수가 중첩 함수 호출 대신 반환하면? 코드는 이렇게:
def print_msg(msg):
def printer():
print(msg)
return printer # 중첩 함수 반환
# 반환된 함수 저장
another = print_msg("Hello")
another()
출력
Hello
print_msg 실행 완료 후에도 printer 함수가 msg 값 기억. 이 현상—함수가 정의 스코프 변수에 접근 유지—을 Python에서 클로저라 함.
원래 함수 삭제해도 반환된 함수 여전히 작동하는지 확인:
>>> del print_msg
>>> another()
Hello
>>> print_msg("Hello")
Traceback (most recent call last):
... NameError: name 'print_msg' is not defined
반환 함수가 클로저에 필요한 데이터 캡처했기에 계속 작동.
Python에서 클로저 존재 조건은 중첩 함수가:
클로저 여러 이점 제공:
흔한 예: 승수 함수 팩토리.
def make_multiplier_of(n):
def multiplier(x):
return x * n
return multiplier
# 특정 승수 함수 생성
times3 = make_multiplier_of(3)
times5 = make_multiplier_of(5)
print(times3(9)) # 27
print(times5(3)) # 15
print(times5(times3(2))) # 30
출력
27 15 30
Python 데코레이터 문법은 클로저에 크게 의존. 데코레이터 작성 시 래퍼 함수가 데코레이트 대상 함수 캡처해 클로저 형성.
클로저 검사엔 __closure__ 속성 사용. 캡처된 값 보유한 셀 객체 튜플 반환. 예:
>>> make_multiplier_of.__closure__
>>> times3.__closure__
(<cell at 0x0000000002D155B8: int object at 0x000000001E39B6E0>,)
각 셀의 cell_contents 속성에 클로저가 캡처한 실제 값:
>>> times3.__closure__[0].cell_contents
3
>>> times5.__closure__[0].cell_contents
5
클로저 이해로 불필요한 전역 변수 피하고 함수형 패러다임 포용하는 더 깔끔하고 모듈화된 Python 코드 작성 가능.
python
Python 문자열 이 튜토리얼에서는 Python에서 문자열을 생성, 포맷팅, 수정, 삭제하는 방법을 배웁니다. 다양한 문자열 연산과 함수도 소개합니다. 동영상: Python 문자열 Python에서 문자열이란? 문자열은 문자들의 시퀀스입니다. 문자는 단순히 기호입니다. 예를 들어 영어는 26개 문자를 가집니다. 컴퓨터는 문자가 아닌 숫자(이진법)를 다룹니다. 화면엔 문자가 보이지만 내부적으로는 0과 1의 조합으로 저장되고 조작됩니다. 문자를 숫자로 변환하는 것을 인코딩(encoding), 역과정을 디코딩(decoding)이라고 합니
Python 메인 함수란? 메인 함수는 Python 프로그램의 진입점. 스크립트 직접 실행 시 인터프리터가 코드 순차 실행. def main() 안 코드는 스크립트가 주 모듈일 때만 실행, 다른 곳에서 임포트 시 실행 안 됨. 명확한 예제로 살펴보기. 예제 1: main() 정의 def main(): print(Hello World!) print(Guru99) 이 파일 실행 시 Guru99만 출력. Hello World! 줄은 main() 안에 있어 호출되지 않음. main()을 스크립트가 메인 프로그램으로 실행될