250x250
반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Retry
- session 유지
- subdag
- grad-cam
- BigQuery
- hadoop
- XAI
- TensorFlow
- GenericGBQException
- integrated gradient
- API Gateway
- youtube data
- airflow subdag
- correlation
- GCP
- spark udf
- Airflow
- requests
- Counterfactual Explanations
- UDF
- chatGPT
- 공분산
- tensorflow text
- login crawling
- 유튜브 API
- API
- top_k
- gather_nd
- 상관관계
- flask
Archives
- Today
- Total
데이터과학 삼학년
First Class Function (일급 함수) 본문
반응형
파이썬 First class function에 대해 알아보자. python은 함수 자체를 변수로 할당할 수 있다.
함수 자체를 인자 (argument) 로써 다른 함수에 전달하거나 다른 함수의 결과값으로 리턴 할수도 있고, 함수를 변수에 할당하거나 데이터 구조안에 저장할 수 있는 함수이다.
결국 클로저를 활용할 수 있는 기반이 되는 개념이라고 보면 된다.
간단한 코드로 알아보자
# -*- coding: utf-8 -*-
def square(x):
return x * x
print(square(5))
f = square
print(square)
print(f)
print(f(5))
========
<function square at 0x1018dfe60> ## 저장된 메모리 주소값
<function square at 0x1018dfe60>
25
함수 자체를 f라는 변수에 할당한 후 호출한 코드이다.
이렇게 함수를 변수로 할당하여 사용하면, 반복되는 코드에 조금 다른 코드를 적용하기 위해서 아래와 같이 간편하게 적용할 수 있다.
# -*- coding: utf-8 -*-
def square(x):
return x * x
def cube(x):
return x * x * x
def quad(x):
return x * x * x * x
def my_map(func, arg_list):
result = []
for i in arg_list:
result.append(func(i)) # square 함수 호출, func == square
return result
num_list = [1, 2, 3, 4, 5]
squares = my_map(square, num_list)
cubes = my_map(cube, num_list)
quads = my_map(quad, num_list)
print(squares)
print(cubes)
print(quads)
===============
[1, 4, 9, 16, 25]
[1, 8, 27, 64, 125]
[1, 16, 81, 256, 625]
다른 예로 nested 함수를 정의하고, 이를 변수로 할당하여 처리하는 경우
유용하게 사용할 수 있는 예가 있다.
# -*- coding: utf-8 -*-
def logger(msg):
def log_message(): #1
print('Log: ', msg)
return log_message
log_hi = logger('Hi')
print(log_hi) # log_message 오브젝트가 출력됩니다.
log_hi() # "Log: Hi"가 출력됩니다.
=======
<function log_message at 0x1029ca140>
Log: Hi
여기서 log_message() 함수는 클로저(closure)라고 부른다. 클로저는 다른 함수의 지역변수를 그 함수가 종료된 이후에도 기억 할 수 있다.
# -*- coding: utf-8 -*-
def logger(msg):
def log_message(): #1
print('Log: ', msg)
return log_message
log_hi = logger('Hi')
print(log_hi) # log_message 오브젝트가 출력됩니다.
log_hi() # "Log: Hi"가 출력됩니다.
del logger # 글로벌 네임스페이스에서 logger 오브젝트를 지웁니다.
# logger 오브젝트가 지워진 것을 확인합니다.
try:
print(logger)
except NameError:
print('NameError: logger는 존재하지 않습니다.')
log_hi() # logger가 지워진 뒤에도 Log: Hi"가 출력됩니다.
======
<function log_message at 0x1007ca1b8>
Log: Hi
logger는 존재하지 않습니다.
Log: Hi
logger가 지워진 뒤에도 log_hi()를 실행하여 log_message가 호출된 것을 볼 수 있다.
logger 함수를 완전히 삭제한 이후에도 log_message 함수는 'Hi'를 기억하고 있는 것을 확인했다.
클로저를 좀 더 실용적으로 쓸 수 있는 예
# -*- coding: utf-8 -*-
# 단순한 일반 함수
def simple_html_tag(tag, msg):
print('<{0}>{1}<{0}>'.format(tag, msg))
simple_html_tag('h1', '심플 헤딩 타이틀')
print '-'*30
# 함수를 리턴하는 함수
def html_tag(tag):
def wrap_text(msg):
print('<{0}>{1}<{0}>'.format(tag, msg))
return wrap_text
print_h1 = html_tag('h1') #1
print(print_h1) #2
print_h1('첫 번째 헤딩 타이틀') #3
print_h1('두 번째 헤딩 타이틀') #4
print_p = html_tag('p')
print_p('이것은 패러그래프 입니다.')
============
<h1>심플 헤딩 타이틀<h1>
------------------------------
<function wrap_text at 0x1007dff50>
<h1>첫 번째 헤딩 타이틀<h1>
<h1>두 번째 헤딩 타이틀<h1>
<p>이것은 패러그래프 입니다.<p>
출처 : http://schoolofweb.net/blog/posts/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%8D%BC%EC%8A%A4%ED%8A%B8%ED%81%B4%EB%9E%98%EC%8A%A4-%ED%95%A8%EC%88%98-first-class-function/
728x90
반응형
LIST
'Python' 카테고리의 다른 글
python custom import path 지정 (0) | 2020.07.15 |
---|---|
argparse 리스트(list), boolean(True or False) 를 파라미터로 받는 방법 (0) | 2020.07.09 |
Magic method (매직 메서드) (0) | 2020.04.06 |
Inheritance and Subclass (상속과 서브 클래스) (0) | 2020.04.06 |
Instance method, Class method, Static method (1) | 2020.04.04 |
Comments