상세 컨텐츠

본문 제목

클로저 (Closure) (1) - 일급함수 (First-class function)

개발/python-병렬처리

by Matthew0633 2022. 5. 6. 20:32

본문

일급함수 (First-class function)

In computer science, a programming language is said to have first-class functions if it treats functions as first-class citizens. This means the language supports passing functions as arguments to other functions, returning them as the values from other functions, and assigning them to variables or storing them in data structures.[1] Some programming language theorists require support for anonymous functions (function literals) as well
(https://en.wikipedia.org/wiki/First-class_function)

일급함수에 대해 Wiki 에서는 다음과 같이 설명하고 있다. 프로그래밍 언어 내에서 함수에 대해 다음과 같이 다룰 수 있다면 일급함수를 가진다고 말할 수 있다. 함수는 다른 함수의 인자로 들어갈 수 있으며, 함수의 반환값이 될 수 있다. 함수를 변수에 할당할 수 있으며, 자료구조 내에 담을 수도 있다. 또한 필수적인 조건은 아니지만, 익명함수로도 작성될 수 있는 것도 해당된다

이러한 정의에 비춰볼 때, 파이썬은 일급함수를 가진다. 일급함수의 각 특징에 대해 파이썬 코드 예시와 함께 살펴보자

일급함수의 특징과 예시

일급함수 특징 (1) - 런타임 초기화

함수가 실행시점에 초기화 된다

일급함수 특징 (2) - 함수를 객체로서 변수에 할당 가능하다

# 함수는 객체이다
def factorial(n):
    '''Factorial Function -> n : int'''
    if n == 1: # n < 2
        return 1
    return n * factorial(n-1)

class A:
    pass

# func class 의 객체
print(factorial(6))
print(factorial.__doc__)
print(type(factorial), type(A))
print(set(sorted(dir(factorial))) - set(sorted(dir(A))))
print(factorial.__name__)
print(factorial.__code__)

# 변수 할당
var_func = factorial

print(var_func)
print(var_func(10))

일급함수 특징 (3) - 함수를 인자로 전달 가능

# 함수 인수 전달 및 함수로 결과 반환 -> 고위 함수(Higher-order function)
# map, filter, reduce 등

# map, filter
print(list(map(var_func, filter(lambda x: x % 2, range(1,6)))))
print([var_func(i) for i in range(1,6) if i % 2])

# reduce
from functools import reduce
from operator import add

print(reduce(add, range(1,11))) # 누적
print(sum(range(1,11)))

# 익명함수(lambda) - 일반 함수 형태로 리팩토링 권장
print(reduce(lambda x, t: x + t, range(1,11)))

일급함수 특징 (4) - 함수를 return 가능

# Callable : 호출 연산자 -> 메소드 형태로 호출 가능한지 확인
# 호출 가능 확인
print(callable(str), callable(list), callable(var_func), callable(3.14))

from inspect import signature

sg = signature(var_func) 

print(sg)
print(sg.parameters)

# partial 사용법 : 인수 고정 -> 콜백 함수에 사용
from operator import mul
from functools import partial

print(mul(10,10))

# 인수 고정
five = partial(mul, 5)

# 고정 추가
six = partial(five, 6)

print(five(10))
print(six())
print([five(i) for i in range(1,11)])
print(list(map(five, range(1,11))))

관련글 더보기

댓글 영역