티스토리 뷰
멀티캠퍼스 AI과정/01 Python Basic
Python 05, 06 - Magic function, First Class, Closure
jhk828 2021. 1. 5. 14:18Python 05, 06 - Magic function, First Class, Closure
- Magic function, First Class, 일급 시민 조건 3가지, Closure
<Magic function>
- method의 이름 앞뒤에 __가 붙어있는 method
- class 안에 정의되어 있는 특수한 형태의 method
- 특수한 상황에서 그에 맞는 magic function이 callback (호출)된다.
- magic function - overriding (오버라이딩) 하여 사용한다.
class Car(object):
def __init__(self, model, price):
self.model = model
self.price = price
del __dell__(self):
print("소멸자가 호출되었습니다!")
def __repr__(self):
return self.model
def __lt__(self, other):
if self.price < other.price:
return "{} 가격이 더 낮아요!!".format(self.model)
else:
return "{} 가격이 더 높아요!!".format(self.model)
a = 100
print(type(a)) # class 'int'가 존재한다.
class MyInt(int):
pass
my_num = MyInt(100)
print(my_num + 200) # 300
print(my_num.__add__(200)) # 300
<First Class>
- 1급 시민 => 함수를 runtime으로 생성할 수 있다.
- 프로그램의 구성 요소 (객체-값, 객체, 함수)가 다음의 조건을 만족하면 first-class citizien이다.
- 1) 구성요소가 변수나 데이터 구조의 속성으로 저장될 수 있다.
- 2) 함수의 인자로 전달될 수 있다.
- 3) 함수의 결과로 리턴될 수 있다.
- python은 1급 시민 지원, Java는 미지원
- 일반 숫자 타입의 데이터가 일급 시민인 이유
- => 숫자 타입은 변수에 저장도 가능, 함수의 인자로 넘겨줄 수도, 함수의 결과로 리턴될 수도 있다.
<1급 시민 조건들>
- 함수를 변수에 저장할 수 있다.
- 함수를 다른 함수의 인자로 저장할 수 있다. =>
Decorator
- 함수를 다른 함수의 리턴값으로 사용할 수 있다. => cf)
Closure
# 1급 시민 조건들
# 1. 함수를 변수에 저장할 수 있다.
def my_add(x, y):
return x + y
print(my_add) # <function my_add at 0x00000195179D45E8>
f = my_add # 변수 안에 저장된 메모리주소를 변수 f에 저장
print(f) # <function my_add at 0x00000263A7C945E8> => f도 같은 함수 pointing
print(f(100, 200)) # 300
# 2. 함수를 다른 함수의 인자로 전달할 수 있다.
def my_add(x, y):
return x + y
def my_sub(x, y):
return x - y
def my_operation(func, arg_list):
result = []
for (tmp1, tmp2) in arg_list:
result.append(func(tmp1, tmp2))
return result
data = [(1, 2), (3, 4), (5, 6)]
print(my_operation(my_add, data)) # [3, 7, 11]
print(my_operation(my_sub, data)) # [-1, -1, -1]
# 3. 함수를 다른 함수의 리턴값으로 사용할 수 있다. => cf) Closure
def addMaker():
def my_add_maker():
return 100
return my_add_maker # 실행코드 자체를 리턴
print(addMaker()) # <function addMaker.<locals>.my_add_maker at 0x0000021BF6914708>
print(addMaker()()) # 100
<Closure>
- first-class function (일급 함수)의 개념을 이용하여 scope에 묶인 변수를 바인딩하기 위한 기술
- 클로저는 데이터를 저장한 레코드다.
- 스코프 안의 변수가 소멸되어도, 클로저를 통해 접근할 수 있다.
- => 클로져를 이용하여 런타임시에 필요한 함수를 만들어 낼 수 있다.
## Closure
def addMaker(x): # x는 addMaker함수의 지역변수
def my_add_maker(y):
return x + y # 지역변수 x가 사라지지 않고 실행됨
return my_add_maker
add_5 = addMaker(5)
add_10 = addMaker(10) # 함수를 동적으로 사용 가능 - runtime시 새로운 기능을 생성
print(add_5(100)) # 105
print(add_10(100)) # 110
'멀티캠퍼스 AI과정 > 01 Python Basic' 카테고리의 다른 글
Python 07, 08, 09 - Decorator, Module, Exception (0) | 2021.01.05 |
---|---|
Python 04 - Python 객체지향 프로그래밍 1, 2, 3 (0) | 2021.01.05 |
Python 03 - Python 함수/ 내장/ 외장/ 람다 함수 (0) | 2021.01.05 |
Python 02 - 입출력, 제어문, List Comprehension (0) | 2021.01.05 |
Python - 01 DateTime (0) | 2021.01.05 |
댓글