goodthings4me.tistory.com
■ 클로저(Closure)는 함수를 만들어서 반환하는 함수 - 파이썬의 함수도 개체이기 때문에 가능
def maker1(m):
def inner(): # 함수 안에 정의된 함수(nested 함수)
print('closure ' * m)
return inner() # nested 함수 실행 후 반환
f1 = maker1(2) # closure closure
print(f1) # None
def maker2(m):
def inner():
print('closure ' * m)
return inner # nested 함수 반환
f2 = maker2(3) # print 함수 실행 X
f2() # closure closure closure --> print('clouser ' * m) 실행, m의 값 참조
print(f2) # inner 함수 리턴 확인(함수 오브젝트 리턴)
# <function maker2.<locals>.inner at 0x000001F08EC25C80>
# 이때, 매개변수 m은 maker 함수 안에서 선언된 변수이고, 실행이 종료된 함수(maker)의 변수는 소멸되는 것이 정상인데, 어디에 있을까?
# 이렇게 함수의 안쪽에 위치한 함수(nested func)가 자신이 필요한 변수의 값을 어딘가에 저장해 놓고 호출 시 참조하는 테크닉을 "클로저(Clouser)"라 한다.
※ 변수값 m의 위치는?
print(type(f2)) # <class 'function'>
print(dir(f2)) # '__closure__'
print(f2.__closure__) # (<cell at 0x000001F08E83D7F8: int object at 0x00007FF8DF8B9380>,)
print(type(f2.__closure__)) # <class 'tuple'>
print(f2.__closure__[0])
# <cell at 0x000001F08EBE1678: int object at 0x00007FF8DF8B9380>
print(dir(f2.__closure__[0])) # 'cell_contents'
print(f2.__closure__[0].cell_contents) # 3
# 변수 m의 값의 위치는 __clouser__의 인덱스 0의 위치에 저장된 객체의 변수(속성)인 cell_contents에 있다.
※ 변수 2개인 경우는?
def maker3(m, n):
def inner():
print(n * m)
return inner
f3 = maker3(4, 'Closure')
f3() # ClosureClosureClosureClosure
print(f3.__closure__)
# (<cell at 0x000001F08EBE1E28: int object at 0x00007FF8DF8B93A0>,
# <cell at 0x000001F08ECAD048: str object at 0x000001F08E838B90>)
print(f3.__closure__[0].cell_contents) # 4
print(f3.__closure__[1].cell_contents) # Closure
# 변수는 __closure__의 인덱스에 저장됨
※ 클로저(Closure) 응용
def outer(tag):
tag = tag
def inner_html(text):
contents = text
print('<{0}>{1}<{0}><br/>'.format(tag, contents))
return inner_html
p_tag = outer('h2')
p_tag('파이썬 중첩함수(Nested Func)와 클로저(Closure)')
[실행 결과]
<h2>파이썬 중첩함수(Nested Func)와 클로저(Closure)<h2><br/>
[참고 자료] 윤성우의 열혈파이썬 중급편
블로그 인기글
[엑셀] 근무연수 및 근무 개월수 계산하는 함수
직장을 다니다 보면 몇 년 몇 개월 또는 전체 며칠을 다니고 있는지 궁금할 때가 있다. 아니면, 총무나 인사 일을 할 때 직원들의 근속연수 또는 근속개월수 등을 계산하고 싶을 때도 있다. 이런 경우 엑셀 함수를 활용하면 어떨까!! 근무연수 및 근무 개월수 계산 함수 알아보기 엑셀에서 근무연수 또는 근무 개월수 계산하는 것은 datedif() 함수를 사용하면 간단하게 해결할 수 있다. 아래 이미지를 보면서 설명하면, 셀 E1에 기준일자를 입력하고, 근무연수를 구할 때는 =datedif(B3,$E$1,"Y")&"년" 을 입력한다. 근무개월수는 =datedif(B3,$E$1,"M")&"개월" 처럼 입력한다. 일수까지 파악할 때문 별로 없지만, 심심풀이로 구해보고 싶을 때 =datedif(B3,$E$1,"D")..
goodthings4me.tistory.com
엑셀 시트 분리 저장 - 엑셀 파일의 시트를 분리하여 저장하기
엑셀을 사용하다 보면 엑셀 시트를 분리해서 저장해야 할 때가 있다. 최근에도 이런 경우가 발생하여 구글링 후 엑셀 시트 분리 업무를 수행하고 내친김에 다른 사람들도 사용할 수 있도록 파이썬 tkinter로 프로그램으로 만들어 보았다. Excel Sheets 분리 저장하는 프로그램(with 파이썬 Tkinter) ※ 프로그램 다운로드(네이버 MYBOX에서 공유) : ExcelSeparateSheets.zip ▶ 프래그램을 실행하면 다음과 같이 초기 화면이 보인다. 찾아보기 : 엑셀 파일이 있는 폴더를 선택한다. (프로그램이 있는 최상위 디렉터리가 열린다) 실행하기 : 프로그램 실행 버튼 상태 변경 순서 : 실행전 → 실행 중 → Sheet "OOO" 분리 저장 중 → 실행 완료 실행 결과 확인 : 엑셀 파..
goodthings4me.tistory.com
유튜브 영상 등의 URL 주소를 QR코드로 만들기
네이버 QR코드, makeQR, MUST QRcode, 무료 온라인 QRCode 생성기 등의 웹사이트에서 유튜브 영상 등의 URL을 입력하여 QR코드를 만들 수 있다. QR코드를 생성할 수 있는 사이트와 프로그램 URL 주소를 붙여넣기 한 후 "QR 코드 생성" 버튼을 클릭하면 큐알코드가 이미지로 생성되고, 다운로드도 할 수 있는 사이트 https://truedoum.com/useful/qrcode/ # 유튜브에서 동영상 URL을 복사하는 방법 유튜브에서 QR코드를 만들 동영상을 검색한다. 해당 동영상을 클릭한다. 동영상 위에서 마우스 우클릭 후 나오는 팝업창에서 “동영상 URL 복사”를 클릭하거나 영상 하단의 “공유”를 클릭하여 나온 창에서 URL를 복사한다. 아래의 웹사이트 중 하나를 선택한 후 복사..
goodthings4me.tistory.com
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
[python] 파이썬 스태틱(static) 메서드와 클래스(class) 메서드 (0) | 2020.09.17 |
---|---|
[python] 파이썬 데코레이터 (Decorator) (0) | 2020.09.16 |
[python] 파이썬 property객체, @property 데코레이터 (0) | 2020.09.14 |
[python] 파이썬 __slots__의 효과 (0) | 2020.09.14 |
[python] 파이썬의 정보은닉(Information Hiding)과 __dict__ 메서드에 대해 (0) | 2020.09.13 |
댓글