[ Python ] First-Class Function(일급 함수)란?

2021. 3. 30. 12:02·Archive/Develop
728x90
반응형

First-Class

 

파이썬의 함수는 first class  하다.

아래 작업들을 수행할 수 있으면 프로그램 개체를 first-class 하는 것으로 정의한다.

 

  • 함수 결과로 리턴할 수 있다.
  • 함수 인수로 전달 가능하다.
  • 데이터의 구조에 저장하거나 변수에 저장할 수 있다.
  • 런타임에 생성할 수 있다.

 

first class object 로써의 함수라는 의미로 first class function 이라는 용어가 사용되고 있다.

사실상 모든 파이썬 함수는 first-class 성질을 가지고 있는 것이다.

 

 

 

1. 변수에 함수 할당해보기

 

 

def add(x):
  return x+x

print (add(5))
f = add
print (add)
print (f)

 

 

위 파이썬 코드의 실행 결과는 아래와 같다.

 

 

 

 

 

 

f 도 함수처럼 동작할까?

 

코드를 수정하고 실행해보자.

 

 

 

def add(x):
  return x+x

print (add(5))
f = add
print (add)
print (f)

print(f(10))

 

 

 

 

 

 

 

2. 함수의 인자로 사용해보기

 

 

 

def add(x):
  return x+x

def append(func, arg_list):
  total = []
  for i in arg_list:
    total.append(func(i))
  return total

li = [1, 2, 3, 4, 5]

print(append(add, li))

 

 

위 코드의 결과는 아래 그림과 같다.

 

 

 

 

 

append 는 wrapper 함수로,

함수를 하나만 정의하여 기존의 함수나 모듈을 수정할 필요 없이 사용자가 편리하게 쓸 수 있게한다.

 

이는 함수가 여러개 일때 빛을 발한다.

 

 

 

def add(x):
  return x+x
def sub(x):
  return x-x
def mul(x):
  return x*x
def div(x):
  return x/x

def append(func, arg_list):
  total = []
  for i in arg_list:
    total.append(func(i))
  return total

li = [1, 2, 3, 4, 5]

print(append(add, li))
print(append(sub, li))
print(append(mul, li))
print(append(div, li))

 

 

 

 

 

기존에 존재하는 함수는 건드리지 않고, 사용가능함을 확인할 수 있다.

 

 

 

 

3. 함수의 결과값으로 리턴하기

 

 

 

def printer(str):
  def print_str():
    print('출력 : ', str)

  return print_str

print_cute = printer('cute')
print(print_cute)
print_cute()

 

 

위 코드의 결과는 아래 그림과 같다.

 

 

 

 

 

print_str 함수를 printer 함수의 리턴값으로 리턴해 print_cute 변수에 할당했다.

 

여기서 주의깊게 살펴볼 점은,

str 변수는 지역변수라 함수가 호출된 이후 메모리상에서 없어진다.

참조할 수 없다는 얘기이다. 

 

그런데 어떻게 'cute' 라는 문자열을 printer 함수가 종료되었음에도 불구하고 참조할 수 있었을까?

 

 

 

여기서 우리는 클로저라는 개념을 배워볼 수 있다.

 

print_str 같은 함수를 클로저라고 부른다.

 

이 클로저는 다른 함수의 지역변수를 그 함수 종료 시점 이후에도 기억할 수 있는 함수이다.

 

 

 

 

 

 

728x90
반응형

'Archive > Develop' 카테고리의 다른 글

[ Django ] 이미지 관리 라이브러리 pillow  (0) 2021.03.30
[ C++ ] 즐거운 은행 놀이  (0) 2021.03.30
[ C++ ] C++의 포인터  (0) 2021.03.30
[ Python ] python Decorator 이용하기 | 코드를 간소화해보자!  (0) 2021.03.30
[ Oracle ] oracle 에서 기본으로 제공해주는 HR 스키마를 가지고 활용해보자!  (0) 2021.03.29
'Archive/Develop' 카테고리의 다른 글
  • [ Django ] 이미지 관리 라이브러리 pillow
  • [ C++ ] 즐거운 은행 놀이
  • [ C++ ] C++의 포인터
  • [ Python ] python Decorator 이용하기 | 코드를 간소화해보자!
코뮤(commu)
코뮤(commu)
코딩으로 커뮤니케이션하는 코뮤입니다 😎
  • 코뮤(commu)
    코뮤(COMMU)
    코뮤(commu)
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Archive
        • Hacking
        • Develop
        • ETC
      • Algorithm
      • DB&Infra
      • ETC
      • Node
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • IT지식보따리
    • IT가 맛있다
    • IT 천재
  • 공지사항

    • 배고픕니다
  • 인기 글

  • 태그

    Codeup
    파이썬 알고리즘
    Django
    Oracle
    장고
    Git
    백준 풀이
    비박스
    파이썬 기초 문제
    코드업 파이썬 기초 100제
    docker
    백준
    백준 파이썬
    자바스크립트 API
    카카오 100일 프로젝트
    C++
    Python
    백준 문제풀이
    oracle db
    보안뉴스
    파이썬 기초
    코드업 기초
    파이썬 문제
    자바스크립트 객체
    오라클
    파이썬
    javascript
    코드업
    자바스크립트
    파이썬 백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
코뮤(commu)
[ Python ] First-Class Function(일급 함수)란?
상단으로

티스토리툴바