[ 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 천재
  • 공지사항

    • 배고픕니다
  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바